資料結構---------------------------------------順序棧和鏈棧的實現
阿新 • • 發佈:2018-12-18
今天想把這個順序棧實現一下,就翻閱資料整理了一下。
下面分別給出順序棧和鏈棧的相應功能的實現。
1)順序棧的圖示:
下面是程式碼:
#include<iostream> #include<algorithm> #include<string.h> #define MAXSIZE 100 using namespace std; typedef int SElemType; typedef int Status; typedef struct { SElemType *base; //棧底指標 SElemType *top; //棧頂指標 int stacksize; }SqStack; //順序棧的初始化 Status InitStack(SqStack &S) { S.base = new SElemType[MAXSIZE]; //為順序棧分配一個大小為MAXSIZE的陣列空間 if(!S.base) return 0; S.top = S.base; //棧底和棧頂指標都指向棧底的位置 S.stacksize = MAXSIZE; //棧的容量為MAXSIZE return 1; } //判斷棧是否為空 int StackEmpty(SqStack S) { if(S.top == S.base) return 0; else return 1; } //求順序棧的長度 int StackLength(SqStack S) { return S.top - S.base; } //清空順序棧 Status ClearStack(SqStack &S) { if(S.base) S.top = S.base; return 1; } //順序棧入棧 Status StackPush(SqStack &S,SElemType e) //將元素e壓入棧頂 { if(S.top - S.base == S.stacksize) //棧滿的情況 return 0; *S.top++=e; //將元素e壓入棧頂並使棧頂指標加1 return 1; } //順序棧的出棧 Status StackPop(SqStack &S,SElemType &e) { if(S.top == S.base) //棧空的情況 return 0; e = *--S.top; //獲取棧頂元素e並使棧頂指標減1 return 1; } //取順序棧棧頂元素 Status GetTop(SqStack S,SElemType &e) { if(S.top == S.base) return 0; //這種情況說明棧空,直接退出 e = *(S.top - 1); return 1; } int main() { ios::sync_with_stdio(false); SqStack S; InitStack(S); int n; cin>>n; for(int i=1;i<=n;i++) //往棧中壓入n個元素 StackPush(S,i); int t; cin>>t; while(t--) //彈出棧中t個元素即依次取棧頂元素 { int m; cin>>m; StackPop(S,m); cout<<m<<endl; } cout<<StackLength(S)<<endl; //輸出操作之後棧的長度 if(StackEmpty(S)) cout<<"此時棧非空!"<<endl; else cout<<"棧空!"<<endl; ClearStack(S); //清空棧 if(StackEmpty(S)) cout<<"此時棧非空!"<<endl; else cout<<"棧空!"<<endl; return 0; }