//顺序栈的类型定义
#define MAXLEN 100 /* 顺序栈的储存空间大小*/
typedef struct
{
int Data[MAXLEN]; //存放顺序栈的数组
int top; //记录顺序栈栈顶的位置
}SeqStack;
#include<stdio.h>
void InitStack(SeqStack *S) //初试化栈
{
//条件:栈空
S->top = -1; //栈顶元素为-1,表示空栈
}
int EmptyStack(SeqStack* S) //判断栈空
{
//条件:top是否为-1
if (S->top == -1) //栈空
return 1;
else
return 0;
}
int FullStack(SeqStack *S) //判断栈满
{
//条件:top==MAXLEN-1
if (S->top == MAXLEN - 1)
return 1;
else
return 0;
}
int Push(SeqStack *S, int x) //进栈
{
//条件:栈满就不可以进栈
if (FullStack(S))
{
printf("栈满,不能进栈!");
return 0;
}
else
{
// 细节:进栈先栈顶位置加1,再放进栈元素
S->top++; //栈顶位置加1
S->Data[S->top] = x; //将进栈元素放进栈顶
return 1;
}
}
int Pop(SeqStack* S, int *x) //出栈
{
// 条件: 栈空就不可以出栈
if (EmptyStack(S))
{
printf("栈空,不能出栈!");
return 0; //正常退出
}
else
{
//细节; 出栈先出元素,再栈顶位置减1
*x = S->Data[S->top];
S->top--;
return 1;
}
}
int GetTop(SeqStack *S ,int *x) //取栈顶元素
{
// 条件:栈空就不可以取栈顶元素
if (EmptyStack(S))
{
printf("栈空,不能取栈顶元素!");
return 0;
}
else
{
*x = S->Data[S->top];
return 1;
}
}
void Menu()
{
printf("\n\n顺序栈的各种操作!");
printf("\n===========================");
printf("\n1--初试化栈");
printf("\n2--进栈操作");
printf("\n3--出栈操作");
printf("\n4--求栈顶元素");
printf("\n5--返回");
printf("\n============================");
printf("\n请输入菜单号:");
}
int main()
{
SeqStack S;
int num,n=1; // num菜单号 n循环变量
int x,y;
int flag; // 做记录
int i;
while (n != 0) {
Menu();
scanf_s("%d", &num);
switch (num)
{
case 1:
InitStack(&S);
printf("栈的初试化完成!");
break;
case 2:
printf("请输入要入栈的元素个数:");
scanf_s("%d", &x);
printf("请输入%d个入栈的整数:", x);
for (i = 0; i < x; i++)
{
scanf_s("%d", &y);
flag = Push(&S, y);
}
if (flag == 1)
printf("入栈成功!");
break;
case 3:
printf("请输入要出栈的元素个数:");
scanf_s("%d", &x);
printf("出栈的元素为:");
for (i = 0; i < x; i++)
{
flag = Pop(&S, &y);
printf("%4d", y);
}
if (flag == 1)
printf("\n出栈成功!");
else
printf("出栈失败!");
break;
case 4:
if (flag == GetTop(&S, &x))
printf("当前栈顶元素值为:%d",x);
break;
case 5:
n = 0; break;
default:printf("输入的菜单号有误!");
}
}
}
效果图: