資料結構-順序棧的基本操作的實現(含全部程式碼)
阿新 • • 發佈:2018-12-10
主要操作函式如下:
- InitStack(SqStack &s) 引數:順序棧s 功能:初始化 時間複雜度O(1)
- Push(SqStack &s,SElemType e) 引數:順序棧s,元素e 功能:將e入棧 時間複雜度:O(1)
- Pop(SqStack &s,SElemType &e) 引數:順序棧s,元素e 功能:出棧,e接收出棧元素值 時間複雜度O(1)
- GetTop(SqStack s,SElemType &e) 引數:順序棧s,元素e 功能:得到棧頂元素 時間複雜度O(1)
- 注意:嚴蔚敏版沒有判斷棧空函式,在入棧、出棧函式裡面判斷棧是否空,與王道的不同 尤其是top指標在base之上(有元素時)
/* Project: sequence_stack (資料結構-順序棧) Date: 2018/09/14 Author: Frank Yu InitStack(SqStack &s) 引數:順序棧s 功能:初始化 時間複雜度O(1) Push(SqStack &s,SElemType e) 引數:順序棧s,元素e 功能:將e入棧 時間複雜度:O(1) Pop(SqStack &s,SElemType &e) 引數:順序棧s,元素e 功能:出棧,e接收出棧元素值 時間複雜度O(1) GetTop(SqStack s,SElemType &e) 引數:順序棧s,元素e 功能:得到棧頂元素 時間複雜度O(1) 注意:嚴蔚敏版沒有判斷棧空函式,在入棧、出棧函式裡面判斷棧是否空,與王道的不同 尤其是top指標在base之上(有元素時) 另外,嚴蔚敏版 59頁取棧頂有誤 */ #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> using namespace std; #define Status int #define SElemType int #define MaxSize 100 //棧資料結構 typedef struct Stack { SElemType *base;//棧底指標 不變 SElemType *top;//棧頂指標 一直在棧頂元素上一個位置 int stacksize;//棧可用的最大容量 }SqStack; //**************************************基本操作函式************************************// //初始化函式 Status InitStack(SqStack &s) { s.base=new SElemType[MaxSize];//動態分配最大容量 if(!s.base) { printf("分配失敗\n"); return 0; } s.top=s.base;//棧頂指標與棧底相同 王道上top起初在base下面,感覺很彆扭,top應該高於或等於base s.stacksize=MaxSize; return 1; } //入棧 Status Push(SqStack &s,SElemType e) { if(s.top-s.base==s.stacksize) return 0;//棧滿 *(s.top++)=e;//先入棧,棧頂指標再上移 注意與王道上的不同,具體問題具體分析 return 1; } //出棧 用e返回值,注意e是應用型別 Status Pop(SqStack &s,SElemType &e) { if(s.top==s.base) return 0;//棧空 e=*--s.top;//先減減 指向棧頂元素,再給e return 1; } //得到棧頂元素,不修改指標 bool GetTop(SqStack s,SElemType &e) //嚴蔚敏版59頁有問題,應該用e去獲得,函式返回bool型別去判斷 { if(s.top==s.base) return false;//棧空 else e=*--s.top; return true; } //********************************功能實現函式**************************************// //選單 void menu() { printf("********1.入棧 2.出棧*********\n"); printf("********3.取棧頂 4.退出*********\n"); } //入棧功能函式 呼叫Push函式 void PushToStack(SqStack &s) { int n;SElemType e;int flag; printf("請輸入入棧元素個數(>=1):\n"); scanf("%d",&n); for(int i=0;i<n;i++) { printf("請輸入第%d個元素的值:",i+1); scanf("%d",&e); flag=Push(s,e); if(flag)printf("%d已入棧\n",e); else {printf("棧已滿!!!\n");break;} } } //出棧功能函式 呼叫Pop函式 void PopFromStack(SqStack &s) { int n;SElemType e;int flag; printf("請輸入出棧元素個數(>=1):\n"); scanf("%d",&n); for(int i=0;i<n;i++) { flag=Pop(s,e); if(flag)printf("%d已出棧\n",e); else {printf("棧已空!!!\n");break;} } } //取棧頂功能函式 呼叫GetTop void GetTopOfStack(SqStack &s) { SElemType e;bool flag; flag=GetTop(s,e); if(flag)printf("棧頂元素為:%d\n",e); else printf("棧已空!!!\n"); } //主函式 int main() { SqStack s;int choice; InitStack(s); while(1) { menu(); printf("請輸入選單序號:\n"); scanf("%d",&choice); if(choice==4) break; switch(choice) { case 1:PushToStack(s);break; case 2:PopFromStack(s);break; case 3:GetTopOfStack(s);break; default:printf("輸入錯誤!!!\n"); } } return 0; }
有問題請下方評論,轉載請註明出處,並附有原文連結,謝謝!如有侵權,請及時聯絡。