小結:
一、棧的基本定義:是限定僅在表尾進行插入或刪除操作的線性表。也叫做后進先出的線性表。
二、棧的表示和實現:
1.順序棧:利用一組地址連續的存儲單元依次存放自棧底到棧頂的元素。
2.鏈棧:鏈棧是沒有附加頭結點的運算受限的單鏈表。棧頂指針就是鏈表的頭指針。
三、棧的應用舉例:
1.數制轉換
2.括號匹配的檢驗(2015年考研真題)
3.行編輯程序
4.棧與遞歸
5.表達式求值
棧的基本操作實現:
棧的結構定義:
typedef struct { int * base; int * top; int stacksize; }SqStack;
初始化:
void InitStack(SqStack * s) { s->base = (int *)malloc(STACK_INIT_SIZE*sizeof(int)); s->top = s->base; s->stacksize = STACK_INIT_SIZE; }
進棧:
void Push(SqStack *s, int e) { if (s->top - s->base >= s->stacksize) { s->base = (int *)realloc(s->base, (s->stacksize + STACKINCREMENT)*sizeof(int)); s->top = s->base + s->stacksize; s->stacksize += STACKINCREMENT; } *s->top = e; s->top++; }
出棧:
int Pop(SqStack *s) { int i; if (s->top == s->base) return 0; s->top--; i = *s->top; return i; }
打印函數:
void Print(SqStack *s) { int * temp; temp = s->top; while (temp != s->base) { temp--; printf("%d ", *temp); } }
主函數:
int main() { SqStack S; InitStack(&S); int num; for (int i = 1; i <= 6; i++) { scanf("%d", &num); Push(&S, num); } printf("打印棧里的元素:"); Print(&S); printf("\n"); int n = Pop(&S); printf("出棧的元素為:%d\n", n); }
運行結果: