数据结构——顺序栈(动态分配空间)的基本操作
代码主要来源:【数据结构】【清华大学】【严蔚敏】
顺序栈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");
}
}