实现代码如下:
#include<stdio.h>
#include<stdlib.h>
#define STACKINITSIZE 256 //初次分配空间大小
#define STACKINCREMENT 128 //空间分配增量大小
#define OK 1
#define ERROR 0
typedef int ElemType, Status;
typedef struct SeqStack
{
ElemType* pBase; //动态存储空间的基地址,作为栈底
ElemType* pTop; //栈顶指针,指向真实栈顶元素的下一位置
int stacksize; //当前已分配的存储空间大小
}SeqStack;
Status InitStack(SeqStack& S) //顺序栈初始化
{
S.pBase = (ElemType*)malloc(sizeof(ElemType));
if (S.pBase == NULL) return ERROR;
S.pTop = S.pBase;
S.stacksize = STACKINITSIZE;
return OK;
}
Status DestroyStack(SeqStack& S) //顺序栈销毁
{
if (S.pBase != NULL)
{
free(S.pBase);
S.pBase = NULL;
}
S.pTop = NULL;
S.stacksize = 0;
return OK;
}
Status ClearStack(SeqStack& S) //顺序栈清空
{
S.pTop = S.pBase;
return OK;
}
Status StackEmpty(SeqStack S) //顺序栈判空
{
if (S.pTop != S.pBase) return ERROR;
return OK;
}
Status StackLength(SeqStack S) //顺序栈元素个数
{
ElemType* p = S.pBase;
int i = 0;
while (p != S.pTop)
{
p = p + 1;
i++;
}
return i;
}
Status GetTop(SeqStack S, ElemType& e) //顺序栈栈顶元素
{
if (S.pTop == S.pBase) return ERROR;
e = *(S.pTop - 1);
return OK;
}
Status StackTraverse(SeqStack S) //顺序栈遍历
{
if (S.pBase == S.pTop) return ERROR;
ElemType* p = S.pBase;
while (p != S.pTop)
{
printf("%d ", *p);
p = p + 1;
}
printf("\n");
return OK;
}
Status Push(SeqStack& S, ElemType e) //顺序栈进栈
{
if (S.pTop - S.pBase >= S.stacksize)
{
S.pBase = (ElemType*)realloc(S.pBase, sizeof(ElemType) * (S.stacksize + STACKINCREMENT));
if (S.pBase == NULL) exit(0);
S.pTop = S.pBase + S.stacksize;
S.stacksize = S.stacksize + STACKINCREMENT;
}
*S.pTop = e;
S.pTop++;
return OK;
}
Status Pop(SeqStack& S, ElemType& e) //顺序栈出栈
{
if (S.pBase == S.pTop) return ERROR;
e = *(S.pTop - 1);
S.pTop--;
return OK;
}
int main()
{
SeqStack S;
InitStack(S);
printf("顺序栈元素个数:%d\n", StackLength(S));
Push(S, 1);
Push(S, 2);
StackTraverse(S);
printf("顺序栈元素个数:%d\n", StackLength(S));
ElemType e;
GetTop(S, e);
printf("栈顶元素:%d\n", e);
Pop(S, e);
StackTraverse(S);
return 0;
}
运行结果如下: