栈——栈的定义及基本操作(初始化、判空、进栈、出栈、遍历栈、销毁栈等)
文章目錄
- 棧的定義
- 棧的存儲
- 棧上的基本操作
- 初始化
- 判空操作
- 進棧操作
- 出棧操作
- 讀棧頂元素
- 遍歷棧
- 銷毀棧
- 完整代碼及實例
- 共享棧
棧的定義
棧(Stack)是只允許在一端進行插入或刪除操作的線性表。
棧的示意圖:
- 棧頂Top:線性表允許插入和刪除的那一端。
- 棧底Bottom:固定的,不允許進行插入和刪除的另一端。
?假設某個棧S={a1,a2, … ,an},如上圖所示,則a1為棧底元素,an為棧頂元素。由于只能在棧頂進行插入和刪除操作,故進棧順序為a1,a2, … ,an,出棧順序為an, … ,a2,a1。故棧的操作特性是后進先出LIFO(Last In First Out),稱為后進先出的線性表。
?空棧:不含任何元素的空表。
棧的存儲
?棧的存儲方式有兩種:順序棧和鏈棧,即棧的順序存儲和鏈式存儲。
?采用順序存儲的棧稱為順序棧,它利用一組地址連續的存儲單元存放自棧底到棧頂的元素,同時附設一個指針(top)指示當前棧頂的位置。
?棧的順序存儲類型描述:
?采用鏈式存儲的棧稱為鏈棧,鏈棧便于多個棧共享存儲空間和提高其效率,且不存在棧滿上溢的情況。通常采用單鏈表實現,并且所有操作都是在單鏈表的表頭進行的。在本文中主要是介紹了順序棧下的一些基本操作,關于鏈棧的實現與單鏈表類似,可以參考單鏈表的定義及其基本操作。
?棧的鏈式存儲類型描述:
typedef struct LinkNode{int data; //數據域struct LinkNode *next; //指針域 }*LiStack; //棧類型定義棧上的基本操作
?棧的基本操作包括:
- 初始化InitStack(&S);
- 判空Empty(S);
- 進棧Push(&S, x);
- 出棧Pop(&S, &x);
- 讀棧頂元素GetTop(S);
- 遍歷棧PrintStack(&S);
- 銷毀棧DestroyStack(&S);
?[注]以上操作均采用順序棧來實現。
初始化
初始時設置S.top = -1。
//初始化 void InitStack(SqStack &S){S.top = -1; }判空操作
???諚l件:S.top == -1; 棧滿條件:S.top ==MaxSize-1。
//判???/span> bool Empty(SqStack S){if(S.top == -1){return true;}else{return false;} }進棧操作
?由于初始設置S.top=-1,故棧頂指針先加一,再入棧。
//入棧 void Push(SqStack &S, int x){if(S.top == MaxSize-1){cout<<"棧滿"<<endl;return;}S.data[++S.top] = x; //指針先加一,再入棧 }出棧操作
?先出棧,指針再減一。
//出棧 void Pop(SqStack &S, int &x){if(S.top == -1){cout<<"???#34;<<endl;return;}x = S.data[S.top--]; //先出棧,指針再減一 }讀棧頂元素
//讀棧頂元素 int GetTop(SqStack S){if(S.top == -1){cout<<"???#34;<<endl;return -1;}else{return S.data[S.top];} }遍歷棧
?當棧不為空時,循環輸出當前棧頂元素。
//遍歷棧 void PrintStack(SqStack S){while(S.top != -1){cout<<S.data[S.top--]<<" ";}cout<<endl; }銷毀棧
?棧的銷毀令S.top = -1即可。
//銷毀棧 void DestroyStack(SqStack &S){S.top = -1; }完整代碼及實例
?完整代碼及實例:
#include<bits/stdc++.h> using namespace std;#define MaxSize 100 //定義棧中元素的最大個數 typedef struct SqStack{int data[MaxSize]; //存放棧中的元素int top; //棧頂指針 }SqStack;//初始化 void InitStack(SqStack &S){S.top = -1; }//判???/span> bool Empty(SqStack S){if(S.top == -1){return true;}else{return false;} }//入棧 void Push(SqStack &S, int x){if(S.top == MaxSize-1){cout<<"棧滿"<<endl;return;}S.data[++S.top] = x; }//出棧 void Pop(SqStack &S, int &x){if(S.top == -1){cout<<"???#34;<<endl;return;}x = S.data[S.top--]; }//讀棧頂元素 int GetTop(SqStack S){if(S.top == -1){cout<<"棧空"<<endl;return -1;}else{return S.data[S.top];} }//遍歷棧 void PrintStack(SqStack S){while(S.top != -1){cout<<S.data[S.top--]<<" ";}cout<<endl; }//銷毀棧 void DestroyStack(SqStack &S){S.top = -1; }int main(){SqStack S;InitStack(S);Push(S,1);//入棧Push(S,2);Push(S,3);Push(S,4);cout<<"棧頂元素為:"<<GetTop(S)<<endl;cout<<"出棧順序為:";PrintStack(S);int x;Pop(S,x);cout<<x<<"出棧"<<endl;cout<<"棧中剩余元素:";PrintStack(S);Pop(S,x);cout<<x<<"出棧"<<endl;cout<<"棧中剩余元素:";PrintStack(S);if(!Empty(S)){cout<<"當前棧不為空"<<endl;}else{cout<<"當前棧為空"<<endl;}return 0; }?運行結果:
共享棧
?利用棧底位置相對不變的特性,可以讓兩個順序棧共享一個一維數據空間,將兩個棧的棧底分別設置在共享空間的兩端,兩個棧頂向共享空間的中間延伸。如下圖所示:
兩個棧的棧頂指針都指向棧頂元素。
判空:top0 = -1 時0號棧為空, top1 = MaxSize-1 時1號棧為空。
棧滿:當且僅當兩個棧頂指針相鄰,即top1 - top0 = 1 時棧滿。
進棧:0號棧進棧時,top0先加一再賦值, 1號棧進棧時top1先減一再賦值。
出棧:0號棧出棧時,先出棧top0再減一, 1號棧出棧時先出棧top1再加一。
總結
以上是生活随笔為你收集整理的栈——栈的定义及基本操作(初始化、判空、进栈、出栈、遍历栈、销毁栈等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS遍历对象或者数组
- 下一篇: MongoDB中的分组