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