代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#define Status int
#define SElemType int
#define MaxSize 100
//栈数据结构
typedef struct Stack {
SElemType *base;//栈底指针 不变
SElemType *top;//栈顶指针 一直在栈顶元素上一个位置
int stacksize;//栈可用的最大容量
} SqStack;
//****************************基本操作函数******************************//
//初始化函数
Status InitStack(SqStack &S) {
S.base=new SElemType[MaxSize];//动态分配最大容量
if(!S.base) {
printf("分配失败\n");
return 0;
}
S.top=S.base;//栈顶指针与栈底相同
S.stacksize=MaxSize;
return 1;
}
//销毁
Status DestroyStack(SqStack &S) {
S.top = NULL;
S.stacksize = 0;
free(S.base);
return 1;
}
//清空
Status ClearStack(SqStack &S) {
S.top = S.base;
return 1;
}
//判断是否为空
bool StackEmpty(SqStack S) {
if(S.top==S.base) return true;
else return false;
}
Status StackLength(SqStack S) {
return S.top-S.base;
}
//得到栈顶元素,不修改指针
bool GetTop(SqStack S,SElemType &e) { //用e去获得,函数返回bool类型去判断
if(S.top==S.base) return false;//栈空
else e=*--S.top;
return true;
}
//入栈
Status Push(SqStack &S,SElemType e) {
if(S.top-S.base==S.stacksize) return 0;//栈满
*(S.top++)=e;//先入栈,栈顶指针再上移
return 1;
}
//出栈
Status Pop(SqStack &S,SElemType &e) {
if(S.top==S.base) return 0;//栈空
e=*--S.top;//先减减 指向栈顶元素,再给e
return 1;
}
//遍历栈
Status StackTraverse(SqStack S) {
if (S.base == NULL)
return 0;
if (S.top == S.base)
printf("栈中没有元素……\n");
SElemType *p;
p = S.top;
while (p > S.base) {
p--;
printf("%d ",*p);
}
return 1;
}
//***************************功能实现函数*******************************//
//菜单
void menu() {
printf("********1.入栈 2.出栈*********\n");
printf("********3.取栈顶 4.退出*********\n");
}
//入栈功能函数 调用Push函数
void PushToStack(SqStack &s) {
int n;
SElemType e;
int flag;
printf("请输入元素个数(>=1):");
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;
}
}
int len=StackLength(s);
printf("栈的长度为:%d\n",len);
}
//出栈功能函数 调用Pop函数
void PopFromStack(SqStack &s) {
int n,flag;
SElemType e;
printf("请输入出栈元素个数(>=1):");
scanf("%d",&n);
for(int i=0; i<n; i++) {
flag=Pop(s,e);
if(flag) printf("%d已出栈\n",e);
else {
printf("栈已空!\n");
break;
}
}
int len=StackLength(s);
printf("栈的长度为:%d\n",len);
}
//取栈顶功能函数 调用GetTop
void GetTopOfStack(SqStack &s) {
SElemType e;
bool flag;
flag=GetTop(s,e);
if(flag) printf("栈顶元素为:%d\n",e);
else printf("栈已空!\n");
int len=StackLength(s);
printf("栈的长度为:%d\n",len);
}
//主函数
int main() {
SqStack s;
int choice;
InitStack(s);
while(1) {
menu();
printf("请输入菜单序号:\n");
scanf("%d",&choice);
if(choice==4) break;
switch(choice) {
case 1:
PushToStack(s);
break;
case 2:
PopFromStack(s);
break;
case 3:
GetTopOfStack(s);
break;
default:
printf("输入错误!");
}
}
return 0;
}
结果截图:
结果