日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈——栈的定义及基本操作(初始化、判空、进栈、出栈、遍历栈、销毁栈等)

發布時間:2023/12/9 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈——栈的定义及基本操作(初始化、判空、进栈、出栈、遍历栈、销毁栈等) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 棧的定義
    • 棧的存儲
    • 棧上的基本操作
      • 初始化
      • 判空操作
      • 進棧操作
      • 出棧操作
      • 讀棧頂元素
      • 遍歷棧
      • 銷毀棧
    • 完整代碼及實例
    • 共享棧

棧的定義

棧(Stack)是只允許在一端進行插入或刪除操作的線性表。

棧的示意圖:

  • 棧頂Top:線性表允許插入和刪除的那一端。
  • 棧底Bottom:固定的,不允許進行插入和刪除的另一端。

?假設某個棧S={a1,a2, … ,an},如上圖所示,則a1為棧底元素,an為棧頂元素。由于只能在棧頂進行插入和刪除操作,故進棧順序為a1,a2, … ,an,出棧順序為an, … ,a2,a1。故棧的操作特性是后進先出LIFO(Last In First Out),稱為后進先出的線性表。

?空棧:不含任何元素的空表。


棧的存儲

?棧的存儲方式有兩種:順序棧和鏈棧,即棧的順序存儲和鏈式存儲。
?采用順序存儲的棧稱為順序棧,它利用一組地址連續的存儲單元存放自棧底到棧頂的元素,同時附設一個指針(top)指示當前棧頂的位置。
?棧的順序存儲類型描述:

#define MaxSize 100 //定義棧中元素的最大個數 typedef struct SqStack{int data[MaxSize]; //存放棧中的元素int top; //棧頂指針 }SqStack;

?采用鏈式存儲的棧稱為鏈棧,鏈棧便于多個棧共享存儲空間和提高其效率,且不存在棧滿上溢的情況。通常采用單鏈表實現,并且所有操作都是在單鏈表的表頭進行的。在本文中主要是介紹了順序棧下的一些基本操作,關于鏈棧的實現與單鏈表類似,可以參考單鏈表的定義及其基本操作。

?棧的鏈式存儲類型描述:

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再加一。

總結

以上是生活随笔為你收集整理的栈——栈的定义及基本操作(初始化、判空、进栈、出栈、遍历栈、销毁栈等)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。