#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//順序棧的初始化
Status InitStack(SqStack &S)
{// 構造一個空棧 S
S.base = new SElemType[MAXSIZE]; //爲順序棧分配一個最大容量爲MAXSIZE的數組空間
if(!S.base)
exit (OVERFLOW); //存儲分配失敗
S.top = S.base;
S.stacksize = MAXSIZE;
return OK;
}
// 順序棧的入棧
Status Push(SqStack &S,SElemType &e)
{ // 插入元素e爲新的棧頂元素
if(S.top-S.base==S.stacksize)
return ERROR; //棧滿
*(S.top++) = e; //元素e壓入棧頂,棧頂指針加1
return OK;
}
// 順序棧的出棧
Status Pop(SqStack &S,SElemType &e)
{// 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR
if(S.base == S.top)
return ERROR;//棧空
e = *(--S.top); //棧頂指針減1,將棧頂元素賦給e
return OK;
}
// 取順序棧的棧頂元素
Status GetTop(SqStack S,SElemType &e)
{// 若棧不空,則用e返回S的棧頂元素,並返回OK;否則返回ERROR
if(S.top == S.base)
return ERROR;
e = *(S.top-1);//棧頂指針減1,將棧頂元素賦給e
return OK;
}
//遍歷棧
Status StackTraverse(SqStack S)
{
SElemType *p;
if (!S.base)
exit(OVERFLOW);
if (S.top == S.base)
cout << "棧中沒有元素" << endl;
p = S.top;
while (p > S.base)
{
p--;
cout << *p << " ";
}
return OK;
}
//銷燬棧
Status DestroyStack(SqStack &S)
{
S.top = NULL;
S.stacksize = 0;
delete(S.base);
return OK;
}
//清空棧
Status ClearStack(SqStack &S)
{
S.top = S.base;
return OK;
}
//判斷棧是否爲空棧
Status StackEmpty(SqStack S)
{
if (S.top == S.base)
return ERROR;
else
return OK;
}
//求棧的長度
Status StackLength(SqStack S)
{
if (S.top == S.base)
return ERROR;
else
return (S.top - S.base);
}
int main(){
int l,j;
SqStack s;
SElemType e;
SElemType t;
int c=-1;
cout<<"1.建立一個空棧\n";
cout<<"2.執行入棧操作\n";
cout<<"3.棧的長度\n";
cout<<"4.遍歷棧\n";
cout<<"5.元素的出棧\n";
cout<<"6.判斷是否爲空棧\n";
cout<<"7.清空棧\n";
cout<<"8.銷燬棧\n";
cout<<"0.退出!\n";
while(c!=0){
cout<<"請選擇:";
cin>>c;
switch(c){
case 1:
if(InitStack(s)==OK)
cout<<"成功建立棧"<<endl;
else
cout<<"棧建立失敗"<<endl;
break;
case 2:
int n;
cout<<"請輸入棧中元素的個數:";
cin>>n;
cout<<"進棧元素依次爲:"<<endl;
if(InitStack(s)==OK)
{
for(j=1;j<=n;j++)
{
Push(s,j);
cout<<j<<" ";
}
}
cout<<endl;
break;
case 3:
l=StackLength(s);
cout<<"棧的長度爲:"<<l;
cout<<endl;
break;
case 4:
StackTraverse(s);
cout<<endl;
break;
case 5:
cout<<"依次彈出的棧頂元素爲:";
while(GetTop(s,e)==OK){
cout<<e<<" ";
Pop(s,t);
}
cout<<endl;
break;
case 6:
cout<<"本棧是否爲空棧:";
if(StackEmpty(s)==ERROR)
cout<<"是"<<endl;
else
cout<<"否"<<endl;
break;
case 7:
ClearStack(s);
cout<<"棧中元素爲:";
StackTraverse(s);
break;
case 8:
if(DestroyStack(s)==OK)
cout<<"銷燬棧成功!";
else
cout<<"銷燬失敗";
break;
}
}
return 0;
}
順序棧的九種基本操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.