定義:一種可以實現“先進后出”的數據存儲結構
分類:靜態棧:以數組為內核 動態棧:以鏈表為內核
算法:入棧(壓棧)/出棧
應用:函數調用、中斷、表達式求職、內存分配、緩沖處理、迷宮
【參考程序歷程】
#include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct Node { int data; struct Node * pNext; }NODE, * PNODE; typedef struct Stack { PNODE pTop; PNODE pBottom; }STACK, * PSTACK; void init(PSTACK);//初始化 void push(PSTACK, int);//壓棧 void traverse(PSTACK);//遍歷 bool pop(PSTACK, int *);//出棧 void clear(PSTACK pS);//清除 int main(void) { STACK S; int val; init(&S);//創建一個空棧 push(&S, 1);//壓棧 push(&S, 2);// push(&S, 3); push(&S, 4); push(&S, 5); push(&S, 6); traverse(&S);//遍歷輸出 clear(&S); if( pop(&S, &val) ) { printf("出棧成功,出棧元素為%d\n", val); } else { printf("出棧失敗!\n"); } traverse(&S); return 0; } void init(PSTACK pS) { pS->pTop = (PNODE)malloc(sizeof(NODE));//動態分配一塊內存(在堆中分配), if(NULL == pS->pTop) { printf("動態內存分配失敗!\n"); exit(-1); } else { pS->pBottom = pS->pTop; pS->pTop->pNext = NULL; } } void push(PSTACK pS, int val) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->data = val; pNew->pNext = pS->pTop; pS->pTop = pNew; return; } void traverse(PSTACK pS) { PNODE p = pS->pTop; while(p != pS->pBottom) { printf("%d\n", p->data); p = p->pNext; } printf("\n"); } bool empty(PSTACK pS) { if(pS->pTop == pS->pBottom) return true; else return false; } bool pop(PSTACK pS, int * pVal) { if(empty(pS)) { return false; } else { PNODE r = pS->pTop; *pVal = r->data; pS->pTop = r->pNext; free(r); r = NULL; return true; } } void clear(PSTACK pS) { if(empty(pS)) { return; } else { PNODE p = pS->pTop; PNODE q = NULL; while(p != pS->pBottom) { q = p->pNext; free(p); p = q; } pS->pTop = pS->pBottom; } }