#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define MAXSIZE 100//存储空间的初始分配量
#define OVERFLOW -2;
#define ERROR 0;
#define OK 1;
typedef int SElemType;
typedef int Status;
//顺序栈
typedef struct//结构体存放指针变量
{
SElemType *base;//栈底
SElemType *top;//栈顶
int stacksize;//最大容量
}SqStack;
int InitStack(SqStack &S) //栈的初始化
{//构造空栈S
S.base =new SElemType[MAXSIZE];//顺序栈动态分配MAXSIZE的数组空间
if(!S.base) return OVERFLOW;//存储分配失败
S.top =S.base ;//top和base指向栈底
S.stacksize=MAXSIZE;//stacksize置为栈的最大容量MAXSIZE
return 1;
}
int Push(SqStack &S, SElemType e)//入栈
{//插入e为栈顶元素
if(S.top-S.base==S.stacksize) return ERROR;//栈满,报错
*S.top++=e;//e压入栈底,栈顶指针加一
return 1;
}
void Pop(SqStack &S,ElemType &e) //出栈
{//删除栈顶元素,e返回其值
if(S.top ==S.base ) return ERROR;//栈空报错
e=*--S.top ;//栈顶指针-1,赋给e
return 1;
}
int GetTop(SqStack S)//取栈顶元素
{//返回S的栈顶元素,但不修改栈顶指针
if(S.top !=S.base ) //栈非空
return *(S.top-1) ;//返回栈顶元素值,栈顶指针不变
return ERROR;//栈空时返回错误值
}
void traverse_Stack(SqStack S)
{
cout<<"栈中的元素有:";
while(S.top!=S.base)
{
S.top--;
cout<<*S.top<<" ";
}
return;
}
// 销毁栈
void DestroyStack(SqStack *S) {
free(S->base);
S->base = S->top = NULL;
S->stacksize = 0;
}
//菜单
void menu()
{printf("********* 1.入栈 **********");
printf("********** 2.出栈 **********");
printf("********** 3.遍历 **********");
printf("******* 4.取栈顶元素 *******");
printf("****** 5.结束程序运行 ******");
}
main()
{
int select;
SqStack S;
InitStack(S);
while(true)
{
menu();
cin>>select;
if(select==5)
{
cout<<"程序运行结束,再见!"<<endl;
break;
}
else if(select>5||select<=0)
{
cout<<"输入数字错误,请重新输入!"<<endl;
system("pause");
system("cls");
}
switch(select)
{
case 1:
Push(S,e);
system("pause");
system("cls");
break;
case 2:
Pop(S,e);
system("pause");
system("cls");
break;
case 3:
traverse_Stack(S);cout<<endl;
system("pause");
system("cls");
break;
case 4:
GetTop(S,e);
system("pause");
system("cls");
break;
}
}
return 0;
}