/* 棧的特性:先進后出。 棧在計算語言處理和將遞歸算法改為非遞歸算法等方面起着非常重要的作用。 */ #define INITSIZE 100 //儲存空間的初始分配量 typedef int ElemType; typedef struct { int top; //棧頂指針 ElemType *base; //存放元素的動態數組空間 int stacksize; //當前棧空間的大小 }sqstack; //初始化操作 //創建一個空棧,棧頂指針top初始化為0 void initstack(sqstack *S) { s->base = (ElemType *)malloc(INITSIZE * sizeof(ElemType)); //申請存儲空間 s->top = 0; //棧頂指針初始值為0 s->stacksize = INITSIZE; //容量為初始值 } //求棧長操作 int getlen(sqstack *S) { return (S->top); } //取棧頂元素操作 //將棧頂元素值存入e指向的內存單位,top值不變 int gettop(sqstack *S,ElemType *e) { if(S->top==0) return 0; //棧空,返回0 *e = S->base[S->top-1]; //棧頂元素值存入指針e所指向的內存單元 return 1; } //壓棧操作 //將入棧元素x存入top所指的位置上,然后棧頂指針top增1 int push(sqstack *S,ElemType x) { if(S->top == S->stacksize) //若棧滿,增加一個存儲單元 { S->base = (ElemType *)realloc(S->base,(S->stacksize+1)*sizeof(ElemType)); if(!S->base) return 0; S->stacksize++; } S->base[S->top++] = x; return 1; } //彈棧操作 //先將棧頂指針top減1,再將top單元中的元素存入指針e所指向的內存單元 int pop(sqstack *S,ElemType *e) { if(S->top==0)return 0; *e = S->base[--S->top]; return 1; } //判棧S是否為空 int emptystack(sqstack *S) { if(S->top==0) return 1; else return 0; } //輸出棧操作 void list(sqstack *S) { int i; for(i=S->top-1;i>=0;i--) { printf("%4d",S->base[i]); } printf("\n"); }
