1. 程式人生 > >資料結構——順序棧(動態分配空間)的基本操作

資料結構——順序棧(動態分配空間)的基本操作

程式碼主要來源:【資料結構】【清華大學】【嚴蔚敏】
順序棧S的基本運算如下:
(1)初始化棧S
(2)棧為空
(3)依次進棧元素a,b,c,d,e
(4)棧為非空
(5)出棧序列:e d c b a
(6)棧為空
(7)釋放棧

完整程式碼如下:

#include <stdio.h>
#include <stdlib.h> 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1 
#define OVERFLOW -1
#define ERROR 0

typedef int SElemType;
typedef int Status; typedef struct Stack{ SElemType *top; SElemType *base; int stacksize; }SqStack; Status InitStack(SqStack &S) { S.base=((SElemType*)malloc(sizeof(SqStack)*STACK_INIT_SIZE)); if(!S.base) exit(-1); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } Status Push
(SqStack &S, SElemType e)//插入棧頂元素操作 { if(S.top-S.base>=S.stacksize) //判斷棧滿,若滿則追加儲存空間 { S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize;// S.top指向新的S.base+S.stacksize(也有可能S.base沒變)
S.stacksize+=STACKINCREMENT; } *S.top++=e; //先賦值然後位置再加一 return OK; } Status Pop(SqStack &S,SElemType &e) { if(S.top==S.base)//棧頂和棧頂指向同一個儲存空間則棧滿了 return ERROR; e=*--S.top; //指標位置先減一再賦值 return OK; } Status GetTop(SqStack S,SElemType &e)//返回棧頂元素,不刪除 { if(S.top>S.base) { e=*(S.top-1); return OK; } else return ERROR; } Status StackEmpty(SqStack S) { if(S.top==S.base) return 1; else return 0; } Status DestroyStack(SqStack &S) { free(S.base); S.base=S.top=NULL; S.stacksize=0; return OK; } int main() { char a[5]={'a','b','c','d','e'}; SqStack s1; int i,e1; InitStack(s1); if(InitStack(s1)) { printf("初始化成功!\n"); } if(StackEmpty(s1)) { printf("此時棧為空\n"); } printf("依次進棧元素:a,b,c,d,e\n"); for(i=0;i<5;i++) { Push(s1,a[i]); } if(!StackEmpty(s1)) { printf("此時棧非空\n"); } printf("出棧序列為:"); while(!StackEmpty(s1)) { Pop(s1,e1); printf("%c ",e1); } if(StackEmpty(s1)) { printf("\n此時棧為空\n"); } if(DestroyStack(s1)) { printf("釋放棧成功!\n"); } }