顺序栈的简单实现:
#include <stdio.h>
#include <iostream>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define MAXSIZE 20
typedef int Status;
typedef int SElemType;
// 顺序栈的存储结构
typedef struct
{
SElemType *base; // 栈底指针
SElemType *top; // 栈顶指针
int stacksize; // 栈可用最大容量
} SqStack;
SqStack S;
bool flag = true;
SElemType e;
//顺序栈的初始化
Status InitSqStack(SqStack &S)
{
S.base = new SElemType[MAXSIZE]; // 为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if (!S.base)
exit(OVERFLOW); // 存储分配失败
S.top = S.base; //top初始为base,空栈
S.stacksize = MAXSIZE; //stacksize置为栈最大容量MAXSIZE
return OK;
}
// 顺序栈的入栈
Status Push(SqStack &S, SElemType e)
{ //插入元素e为新的栈顶元素
if (S.top - S.base == S.stacksize)
return ERROR; // 栈满
*S.top++ = e; //元素e压入栈顶,栈顶指针+1
return OK;
}
// 顺序栈的出栈
Status Pop(SqStack &S, SElemType &e)
{ //删除S的栈顶元素, 用e返回其值
if (S.top == S.base)
return ERROR; // 空栈
// S.top--;
// e = *S.top;
e = *--S.top; // 因为top指向栈顶元素的下一个位置,所以要先指向栈顶才能取到正确的栈顶元素
return OK;
}
// 取顺序栈的栈顶元素
SElemType GetTop(SqStack S)
{
if (S.top == S.base)
{
printf("这是一个空栈.\n");
return ERROR;
}
return *(S.top - 1); // 栈非空
}
void Show()
{
while (flag)
{
puts("1.初始化顺序栈\n2.入栈\n3.出栈\n4.取栈顶元素\n5.退出\n");
int choice;
printf("请输入选择:");
std::cin >> choice;
switch (choice)
{
case 1:
InitSqStack(S);
puts("顺序栈初始化成功.\n");
break;
case 2:
puts("请输入新的栈顶元素e:");
std::cin >> e;
if (!Push(S, e))
puts("入栈fail.\n");
puts("入栈成功!\n");
break;
case 3:
if (!Pop(S, e))
printf("栈顶元素出栈失败.\n\n");
printf("栈顶元素出栈,e = %d\n\n", e);
break;
case 4:
e = GetTop(S);
printf("栈顶元素e:%d\n\n", e);
break;
case 5:
flag = false;
if (!S.base)
{
delete S.base;
S.base = NULL;
}
break;
default:
printf("请重新输入.\n\n");
break;
}
}
}
int main(void)
{
Show();
return 0;
}
运行结果: