#include <stdio.h>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
#define MAXSIZE 100
typedef int SElemType;
typedef struct{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
Status InitStack(SqStack &S){
//栈的初始化
S.base=new SElemType[MAXSIZE];
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
bool StackEmpty(SqStack S){
//判断栈是否为空
return (S.base==S.top);
}
int StackLength(SqStack S){
//栈的长度
return(S.top-S.base);
}
SElemType GetTop(SqStack S){
//返回S的栈顶元素,不修改栈顶指针
if(S.top!=S.base)
return *(S.top-1);
}
Status Push(SqStack &S,SElemType e){
//插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize) return ERROR;
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e){
//删除S的栈顶元素,用e返回其值
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
void StackTraverse(SqStack S){
//从栈底到栈顶依次对栈中每个元素显示
SElemType *p=S.top-1;
while (p>=S.base){
cout<<"\n "<<*p;
p--;
}
}
void ClearStack(SqStack &S){
//清空栈
S.base=S.top;
}
void DestroyStack(SqStack &S){
//销毁栈
delete []S.base;
S.stacksize=0;
S.top=NULL;
S.base=NULL;
}
#include "comdef.h"
#include "sqstackdef.h"
#include "sqstackapp.h"
int main(){
SElemType e;
SqStack S;
int choice;
if (InitStack(S)==OVERFLOW){
cout<<"栈的初始化失败,程序退出!";
return 0;
}
else{
cout<<"栈的初始化成功;";
}
do {
cout<<"\n\n===================================";
cout<<"\n 顺序栈的基本操作 ";
cout<<"\n===================================";
cout<<"\n 1:判断栈是否为空" ;
cout<<"\n 2:求栈的长度" ;
cout<<"\n 3:取栈顶" ;
cout<<"\n 4:入栈" ;
cout<<"\n 5:出栈" ;
cout<<"\n 6:输出栈" ;
cout<<"\n 7:清空栈" ;
cout<<"\n 0:操作结束" ;
cout<<"\n===================================";
cout<<"\n请输入你的选择:";
cin>>choice;
switch (choice){
case 1: if(StackEmpty(S))
cout<<"\n栈为空!" ;
else
cout<<"\n栈不为空!" ;
break;
case 2: cout<<"\n栈的长度为:"<<StackLength(S);
break;
case 3: if(StackEmpty(S))
cout<<"\n栈顶元素为:"<<GetTop(S);
else{
cout<<"\n该栈为空!栈顶元素不存在!";
}
break;
case 4: cout<<"\n输入入栈元素:";
cin>>e;
if(Push(S,e)==OK)
cout<<"\n元素"<<e<<"入栈成功!";
break;
case 5: if(Pop(S,e)==OK)
cout<<"\n元素"<<e<<"出栈!";
else
cout<<"\n栈为空,出栈失败!";
break;
case 6: cout<<"\n从栈顶到栈底的元素依次为:";
StackTraverse(S);
break;
case 7: cout<<"\n清空栈";
ClearStack(S);
break;
case 0: break;
default:cout<<"\n输入错误,重新输入!";
}
} while (choice) ;
DestroyStack(S);
return 0;
}