資料結構——順序棧(動態分配空間)的基本操作
阿新 • • 發佈:2018-12-03
程式碼主要來源:【資料結構】【清華大學】【嚴蔚敏】
順序棧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");
}
}