#include<stdio.h>
#include<stdlib.h>#define STACK_SIZE 100
#define STACKADD 10typedef int SElemType;
typedef struct
{
SElemType *base; //在栈构造之前和销毁之后,base的值为NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的储存空间,以元素为单位
}SqStack;void InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(STACK_SIZE*sizeof(SElemType));
if(!S->base)
{
exit(0);
}
S->top = S->base; //look careful! 只能是s->base 赋值给s->top.
S->stacksize = STACK_SIZE;
}SElemType GetTop(SqStack S,SElemType *e)
{
if(S.top == S.base) //若栈不空,则用e返回栈顶元素
{
exit(0);
}
*e = *(S.top - 1); //栈顶指针始终在栈顶元素的下一位置
return *e;
}void Push(SqStack *S, SElemType e) //把元素压入栈顶
{
if( (S->top - S->base) >= S->stacksize ) //栈满,追加存储空间
{
S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKADD));
if(!S->base)
{
exit(0);
}S->top = S->base + S->stacksize;
S->stacksize += STACKADD;
}*(S->top++) = e;
}SElemType Pop(SqStack *S,SElemType *e) //取出栈顶元素,并返回
{
if(S->top == S->base)
{
exit(0);
}*e = *(--S->top); //一定要如此,不能e = (--S->top)
return *e;
}/*此处可以省略return语句,因为e为指针,可以返回获得的值。可如下所示
void Pop(SqStack *S, SElemType *e)
{
//无return语句
}
*/int StackEmpty(SqStack S)
{
if(S.base == S.top)
{
return 1;
}
return 0;
}int StackLength(SqStack S)
{
return (S.top - S.base);
}void ClearStack(SqStack *S) //注意清空与销毁的区别
{
if(S->base)
{
S->top = S->base;
}
}void DestroyStack(SqStack *S)
{
if(S->base)
{
free(S->base);
}
S->top = -1;
}void main(void)
{
SqStack *S;
SElemType *e;S = NULL;
e = NULL;
e = (SElemType *)malloc(sizeof(SElemType));
S = (SqStack *)malloc(sizeof(SqStack));InitStack(S);
Push(S,2);
// ClearStack(S);
// Pop(S,e);
printf("%d\n",Pop(S,e));
}
第三章(1).顺序栈
最新推荐文章于 2021-09-15 17:37:51 发布