順序棧的九種基本操作
阿新 • • 發佈:2019-02-19
#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; }