順序棧的基本操作 ----- 純c語言
#include <stdio.h> #include <stdlib.h>
typedef int ElemType; #define stack_init_size 100 #define STACKINCREMENT 10 typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack;
void Initsize(sqStack *s) { s->base=(ElemType*)malloc(stack_init_size*sizeof(ElemType)); if(s->base==0) exit(1); //分配失敗 s->top=s->base; //棧頂就是棧低 s->stackSize=stack_init_size;//棧的最大量而不是當前容量 }
void Destroy(sqStack *s) { int i,len; len=s->stackSize; for( i=0;i<len;i++) { free(s->base); s->base++; } s->base=s->top=NULL; s->stackSize=0; }
void Clear(sqStack *s) { s->top=s->base; //將棧中的元素全部作廢,表明這個棧是空的。因為只是操作上top和base一樣了只清空了列表沒有清除值。 }
int GetTop(sqStack *s) { int i=0; if(s->top==s->base) { return 0; } else i=*(s->top-1); return i; }
void Push(sqStack *s, ElemType e) { // 如果棧滿,追加空間 if( s->top-s->base >= s->stackSize ) { s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType)); if( !s->base ) exit(0); s->top=s->base+s->stackSize; // 設定棧頂 s->stackSize=s->stackSize+STACKINCREMENT; // 設定棧的最大容量 }
*(s->top) = e; s->top++; } int Pop(sqStack *s) { int e; if( s->top == s->base ) // 棧已空 return 0; else{ s->top--; e=*(s->top); return e; } } int StackTraverse(sqStack S) { ElemType *p; if (S.base == NULL) { exit(1); } else if (S.top == S.base) { printf("棧中沒有元素……\n"); exit(1); } else { p = S.top; while (p > S.base) { p--; printf("%d ",*p); } return 0; } }
void main() { sqStack s; int i,n,e,k;
printf("初始化一個棧"); Initsize(&s);
printf("輸入棧的長度:\n"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("輸入棧的第%d個元素\n",i); ++s.top; scanf("%d",s.top-1); } printf("遍歷:"); StackTraverse(s);
e=GetTop(&s); printf("\n棧頂元素是%d\n",e); printf("\n請輸入要插入的元素數值:"); scanf("%d",&k); Push(&s,k); printf("遍歷:"); StackTraverse(s);
printf("\n棧頂刪除元素是:"); e=Pop(&s); printf("%d\n",e); printf("\n"); printf("遍歷:"); StackTraverse(s);
printf("清空棧\n"); Clear(&s); printf("遍歷:"); StackTraverse(s);
printf("銷燬棧\n"); Destroy(&s);
}