头文件
#include<stdio.h>
#include<stdlib.h>
栈的结构体定义
#define MAXNUM 20 //可存储的最大的数据量
#define ElemType int
typedef struct //定义栈的顺序表的结构以类型
{
ElemType stack[MAXNUM]; //栈的数据元素
int top; //栈顶指针
//栈底指针bottom默认为0
}SqStack;
初始化顺序栈
void InitStack(SqStack* p)
{
if (!p)
printf("分配内存失败.\n"); //讨论p的内存是否已经正确分配
else
p->top = -1;//将栈设为空栈,空栈的条件是头指针指向-1
}
插入一个元素
void Push(SqStack* p, ElemType x)
{
if (p->top < MAXNUM - 1)
{
p->top = p->top + 1; //此处为栈的静态顺序存储,故top指针指向内存空间已有元素,若要再入栈需将栈顶指针向上移一位
p->stack[p->top] = x; //将元素存入新栈顶指针指向的内存空间
}
else
printf("overflow.\n"); //因为栈是从top=0开始的,所以当top指向maxnum-1时已是最大内存,再插入会满溢
}
删除栈顶元素
ElemType Pop(SqStack* p)
{
ElemType x;
if (p->top >= 0)
{
x = p->stack[p->top]; //将此时栈顶指针指向的元素的值取出
printf("之前的栈顶元素%d已被删除!\n", x);
p->top = p->top - 1; //将栈顶指针下移,这样之前的栈顶元素就不在栈内了
return x;
}
else
{
printf("underflow!\n"); //下溢
return 0;
}
}
取栈顶元素的值
ElemType GetTop(SqStack* p)
{
ElemType x;
if (p->top >= 0)
{
x=p->stack[p->top]; //将栈顶指针指向的元素的值返回到x
printf("\n栈顶元素为:%d\n", x);
return x;
}
else
{
printf("unerflow!\n");//下溢
return 0;
}
}
输出栈表
void OutStack(SqStack* p)
{
int i;
printf("\n");
if (p->top<0)
printf("这是一个空栈\n");
else
{
printf("\n");
for(i=p->top;i>=0;i--) //按栈的示意图的样子输出,即要从后往前输出
printf("第%d个数据元素为:%6d\n", i, p->stack[i]);
}
}
置空顺序栈
void SetEmpty(SqStack* p)
{
p->top = -1; //空栈的表示即栈顶指针指向-1
}
主函数
int main()
{
SqStack* q;
int cord;
ElemType a;
q = (SqStack*)malloc(sizeof(SqStack)); //给顺序栈q分配内存
printf("第一次使用必须初始化!\n");
do
{
printf("\n");
printf("\n 主菜单 \n");
printf("\n 1 初始化顺序栈 \n");
printf("\n 2 插入一个元素 \n");
printf("\n 3 删除栈顶元素 \n");
printf("\n 4 取出栈顶元素 \n");
printf("\n 5 置空顺序栈 \n");
printf("\n 6 结束程序运行 \n");
printf("\n \n");
printf("请从菜单栏中选择要执行的操作");
scanf_s("%d", &cord);
printf("\n");
switch (cord)
{
case 1: {
InitStack(q); //创建一个顺序栈
OutStack(q);} //输出栈表*
break;
case 2: {
printf("请输入要插入的元素:\n");
scanf_s("%d", &a);
Push(q, a); //将元素a压入栈q
OutStack(q);}
break;
case 3: {
Pop(q); //将q中栈顶元素弹出栈
OutStack(q);}
break;
case 4: {
GetTop(q); //去q的栈顶元素的值
OutStack(q);}
break;
case 5: {
SetEmpty(q); //将栈置空
printf("\n顺序栈被置空!\n");
OutStack(q);}
break;
case 6:exit(0); //正常运行程序并退出程序
//exit(1)非正常运行程序并退出程序
}
} while (cord <= 6);
}
运行结果