#include <stdio.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 1024 //顺序栈的最大容量
typedef int SElemType; //定义栈中元素类型,可调整
typedef struct{
SElemType data[MAXSIZE]; // 顺序栈
int top; //栈顶指针
}SeqStack;
//顺序栈的初始化
int InitStack_Sq (SeqStack *&S)
{
S = new SeqStack;
if(!S) //存储分配失败
return ERROR;
S->top=0; //设置栈顶指针值
return OK;
}
//求顺序栈的长度
int StackLength_Sq (SeqStack *S)
{
return S->top;
}
//销毁顺序栈
int DestroyStack_Sq(SeqStack *&S)
{
if(!S){
delete S;
return OK;
}
return ERROR;
}
//清空栈操作
void ClearStack_Sq (SeqStack *&S)
{
S->top=0;
}
//判断顺序栈是否为空
int StackEmpty_Sq (SeqStack *S)
{
return S->top=0;
}
//判断顺序栈是否已满
int StackFull_Sq (SeqStack *S)
{
return S->top==MAXSIZE;
}
//入栈操作
int Push_Sq(SeqStack *S, SElemType e)
{
if (StackFull_Sq(S))
return ERROR; //栈已满
S->data[S->top++]=e;
return OK;
}
//出栈操作
int Pop_Sq(SeqStack *S, SElemType &e)
{
if (StackEmpty_Sq(S))
return ERROR; // 栈空
e=S->data[--S->top];
return OK;
}
//取栈顶元素
int GetTop_Sq(SeqStack *S,SElemType &e)
{
if(StackEmpty_Sq(S)) // 栈空
return ERROR;
e=S->data[S->top-1];
return OK;
}
void DispStack_Sq(SeqStack *S) // 输出顺序栈
{
int p = S->top;
printf("顺序栈元素为:");
if (StackEmpty_Sq(S))
{
printf("栈空!\n");
return;
}
while(p!=0)
printf("%d ",S->data[--p]);
printf("\n");
}
void showmenu()
{
printf(" --顺序栈基本运算演示-- \n");
printf("* 1---顺序栈的初始化 *\n");
printf("* 2---销毁顺序栈 *\n");
printf("* 3---清空顺序栈 *\n");
printf("* 4---判断顺序栈是否为空 *\n");
printf("* 5---判断顺序栈是否已满 *\n");
printf("* 6---入栈操作 *\n");
printf("* 7---出栈操作 *\n");
printf("* 8---取栈顶元素 *\n");
printf("* *\n");
printf("* 0---退出 *\n");
printf("请选择菜单号(0--8):");
}
void Stack_Sq()
{
char choice='N';
SElemType item;
SeqStack *S;
int flag=0; //是否创建好了顺序栈
while(choice!='0')
{
showmenu();
_flushall();
scanf("%c",&choice);
switch(choice)
{
case '1':
printf("初始化顺序栈操作\n");
if(InitStack_Sq(S))
{
printf("初始化成功!\n");
flag=1; //标志顺序表的存在
}
else
printf("初始化失败!\n");
break;
case'2':
if(flag) //顺序栈存在
{
DestroyStack_Sq(S);
flag=0; //顺序栈已删除
printf("顺序栈删除成功!\n");
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'3':
if(flag) //顺序栈存在
{
ClearStack_Sq(S);
printf("顺序栈清空成功!\n");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'4':
if(flag) //顺序栈存在
{
printf("顺序栈%s。\n",StackEmpty_Sq(S)?"空":"不空");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'5':
if(flag) //顺序栈存在
{
printf("顺序栈%s。\n",StackFull_Sq(S)?"空":"不空");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case'6':
if(flag) //顺序栈存在
{
printf("请输入要入栈的元素的值:");
scanf("%d",&item);
if(Push_Sq(S,item))
printf("该元素已入栈\n");
else
printf("栈满,入栈操作失败!\n");
DispStack_Sq(S); //输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case '7':
if(flag) //顺序栈存在
{
if(Pop_Sq(S,item))
printf("出栈元素为:%d。\n",item);
else
printf("栈空!\n");
DispStack_Sq(S);
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case '8':
if(flag) //顺序栈存在
{
if(GetTop_Sq(S,item))
printf("栈顶元素为:%d。\n",item);
else
printf("栈空!\n");
DispStack_Sq(S); // 输出线性表
}else{
printf("顺序栈不存在,操作失败!\n");
}
break;
case '0':
printf("\n\t程序结束!\n");
DestroyStack_Sq(S);
break;
default:
printf("\n\t选择错误,请重新输入!\n");
break;
}
}
}
int main()
{
Stack_Sq();
return 0;
}