#include "cstdio"
#include "cstdlib"
//预先分配空间,这个数值根据实际需要预估确定
#define max_size 128
typedef int ElemType;
typedef struct _SeqStack {
//栈底指针,我这里习惯写成int xxx,当然也可以事先定义
ElemType *base;
//栈顶指针
int *top;
} SeqStack;
bool InitStack(SeqStack &S) {
//为顺序栈分配一个最大容量为 Maxsize 的空间
S.base = new int[max_size];
if (!S.base) {
printf("初始化失败\n");
return false;
}
//top 初始为 base,空栈
= S.base;
return true;
}
bool Is_Full(SeqStack &S) {
if ( - S.base == max_size) {
printf("栈已满\n");
return true;
}
return false;
}
bool Is_Empty(SeqStack &S) {
if ( == S.base) {
printf("栈为空\n");
return true;
}
return false;
}
// 插入元素 e 为新的栈顶元素
bool PushStack(SeqStack &S, int value) {
if (Is_Full(S)) {
return false;
}
//元素 e 压入栈顶,然后栈顶指针加 1,等价于*=e;
*(++) = value;
return true;
}
//删除 S 的栈顶元素,暂存在变量 e中
bool PopStack(SeqStack &S, int &value) {
if (Is_Empty(S)) {
return false;
}
//栈顶指针减 1,将栈顶元素赋给 e
value = *(--);
return true;
}
int GetTop(SeqStack &S) {
if (Is_Empty(S)) {
return -1;
}
// 不能是return *(--);
//返回栈顶元素的值,栈顶指针不变
return *( - 1);
}
//返回栈中元素个数
int GetSize(SeqStack &S) {
return ( - S.base);
}
void DestoryStack(SeqStack &S) {
if (S.base) {
free(S.base);
S.base = NULL;
= NULL;
}
}
int main() {
int num, x;
SeqStack S;
//初始化一个顺序栈 S
InitStack(S);
printf("输入个数:\n");
scanf("%d", &num);
printf("输入数字入栈:\n");
while (num) {
//输入元素
scanf("%d", &x);
PushStack(S, x);
num--;
}
printf("开始逐个出栈:\n");
//如果栈不空,则依次出栈
while (!Is_Empty(S)) {
//输出栈顶元素
printf("%d\t ", GetTop(S));
//栈顶元素出栈
PopStack(S, x);
}
printf("\n");
DestoryStack(S);
return 0;
}