顺序栈的基本操作
代码如下:
#include <iostream>
#include <stdlib.h>
#define STACK_INIT_SIZE 100//栈初始大小
#define STACKINCREMENT 10//每次增加大小
#define OK 1
#define ERROR 0
#define OVERFlOW -2
using namespace std;
typedef int SElemType_Sq;
typedef int Status;
//定义存储表示
typedef struct
{
SElemType_Sq *base;
SElemType_Sq *top;
int stacksize;
} SqStack;
//初始化
Status InitStack_Sq(SqStack &S)
{
S.base = (SElemType_Sq*)malloc(STACK_INIT_SIZE*sizeof(SElemType_Sq));
if(!S.base)
exit(OVERFlOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//销毁顺序栈
Status DestroyStack_Sq(SqStack &S)
{
if (S.base)
{
delete[]S.base;
S.stacksize = 0;
S.base = S.top = NULL;
}
return OK;
}
//判断顺序栈是否为空
bool StackEmpty(SqStack S)
{
if (S.top == S.base)
return true;
else
return false;
}
//求顺序栈的长度
int StackLength(SqStack S)
{
cout<<"顺序栈的长度为:";
return (S.top - S.base);
}
//清空顺序栈
Status ClearStack(SqStack &S)
{
S.top = S.base;
cout<<"成功清空顺序栈"<<endl;
return OK;
}
//访问栈
Status StackTraverse_Sq(SqStack S)
{
SElemType_Sq *p = S.top;
cout<<"顺序栈中元素为:";
while(p>S.base)
cout<<(*--p)<<" ";
cout<<endl;
return OK;
}
//入栈
Status Push_Sq(SqStack &S)
{
int n,e;
cout<<"请输入要入栈的元素个数"<<endl;
cin>>n;
cout<<"请输入要入栈元素:"<<endl;
for (int i=0; i<n; i++)
{
cin>>e;
if (S.top - S.base >= S.stacksize)//栈满
{
S.base = (SElemType_Sq*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType_Sq));
if (!S.base)//分配内存失败
exit(OVERFlOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
}
cout<<"入栈成功"<<endl;
return OK;
}
//出栈
Status Pop(SqStack &S)
{
SElemType_Sq e;
if (S.top == S.base)
return ERROR;
e = *--S.top;
cout<<"元素"<<e<<"成功出栈"<<endl;
return OK;
}
//取栈顶元素
Status GetTop(SqStack S)
{
SElemType_Sq e;
if (S.top == S.base)
return ERROR;
e = *(S.top - 1);
cout<<"栈顶元素为:"<<e<<endl;
return OK;
}
void show_help()
{
cout<<"******* Data Structure ******"<<endl;
cout<<"1----清空顺序栈"<<endl;//
cout<<"2----判断顺序栈是否为空"<<endl;//
cout<<"3----求顺序栈的长度"<<endl;//
cout<<"4----取栈顶元素"<<endl;
cout<<"5----入栈"<<endl;//
cout<<"6----出栈"<<endl;//
cout<<"7----访问栈"<<endl;//
cout<<" 退出,输入0"<<endl;
}
int main()
{
int operate_code;
show_help();
SqStack S;
InitStack_Sq(S);
while(1)
{
cout<<"";
cin>>operate_code;
if(operate_code==1)
{
ClearStack(S);
}
else if (operate_code==2)
{
if (StackEmpty(S))
cout<<"顺序栈为空"<<endl;
else
cout<<"顺序栈不为空"<<endl;
}
else if (operate_code==3)
{
cout<<StackLength(S)<<endl;
}
else if (operate_code==4)
{
GetTop(S);
}
else if (operate_code==5)
{
Push_Sq(S);
}
else if (operate_code==6)
{
Pop(S);
}
else if (operate_code==7)
{
StackTraverse_Sq(S);
}
else if (operate_code==0)
{
break;
}
else
{
cout<<"\n操作码错误!!!"<<endl;
show_help();
}
}
//销毁顺序栈
DestroyStack_Sq(S);
return 0;
}