顺序栈操作合集
完整代码
包含:栈的初始化、顺序栈的初始化、入栈、出栈、取栈顶元素函数;
入栈功能函数;
出栈功能函数;
取栈顶功能函数;
菜单函数、主函数;
//DATA: 2020/5/11
//栈的基本操作合集
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#define Status int
#define MAXSIZE 100
#define SElemType int
//栈的结构定义
typedef struct
{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
} SqStack;
//顺序栈的初始化
/*
1.为顺序栈动态分配一个最大容量为MAXSIZE的数组空间,
使base指向这段空间的基地址,即栈底
2.栈顶指针top初始为base,表示栈为空
3.stacksize置为栈的最大容量MAXISIZE
*/
Status InitStack(SqStack &S)
{//构造一个空栈S
S.base = new SElemType[MAXSIZE]; //为顺序栈动态分配一个最大容量为MAXSIZE的 数组空间
if(!S.base) exit (OVERFLOW); //存储分配失败
S.top = S.base; //top初始为base,空栈
S.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
return 1;
}
//顺序栈的入栈
/*
1.判断栈是否满,若满则返回ERROR
2.将新元素压入栈顶,栈顶指针加1
*/
Status Push(SqStack &S, SElemType e)
{//插入元素e为新的栈顶元素
if(S.top-S.base == S.stacksize) return 0; //栈满
*S.top++ = e; //元素e压入栈顶,栈顶指针加1
return 1;
}
//顺序栈的出栈
/*
1.判断栈是否为空,若空则返回ERROR
2.栈顶指针减1,栈顶元素出栈
*/
Status Pop(SqStack &S, SElemType &e)
{//删除S的栈顶元素,用e返回其值
if(S.top == S.base) return 0; //栈空
e = *--S.top;
return 1;
}
//取顺序栈的栈顶元素
bool GetTop(SqStack s,SElemType &e)
{//返回S的栈顶元素,不修改栈顶指针
if(s.top == s.base) return false; //栈空
else e = *--s.top;
return true;
}
//入栈功能函数(调用Push函数)
void PushInStack(SqStack &s)
{
int n;
SElemType e;
int flag;
printf("请输入入栈元素的个数(>=1): \n");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("请输入第%d个元素的值:",i+1);
scanf("%d",&e);
flag = Push(s,e);
if(flag)printf("%d已入栈\n",e);
else{
printf("栈已满!!!\n");
break;
}
}
}
//出栈功能函数(调用Pop函数)
void PopOutStack(SqStack &s)
{
int n;
SElemType e;
int flag;
printf("请输入出栈元素的个数(>=1):\n");
scanf("%d",&n);
for(int i=0;i<n;i++){
flag = Pop(s,e);
if(flag) printf("%d已出栈\n",e);
else {
printf("栈已空!!!\n");
}
}
}
//取栈顶功能函数(调用GetTop)
void GetTopOfStack(SqStack &s)
{
SElemType e;
bool flag;
flag=GetTop(s,e);
if(flag) printf("栈顶元素为:%d\n",e);
else{
printf("栈已空!!!\n");
}
}
//菜单函数
void menu()
{
printf("********1.入栈 2.出栈********\n");
printf("********3.取栈顶 4.退出********\n");
}
//主函数
int main()
{
SqStack s;
int choice;
InitStack(s);
while(1)
{
menu();
printf("请输入菜单序号:\n");
scanf("%d",&choice);
if(choice == 4) break;
switch(choice)
{
case 1:PushInStack(s);break;
case 2:PopOutStack(s);break;
case 3:GetTopOfStack(s);break;
default:printf("输入错误!!!\n");
}
}
return 0;
}