棧的基本操作


順序,即用順序表實現棧存儲結構。通過前面的學習我們知道,使用棧存儲結構操作數據元素必須遵守 "先進后出" 的原則,本節就 "如何使用順序表模擬棧以及實現對棧中數據的基本操作(出棧和入棧)" 給大家做詳細介紹。

如果你仔細觀察順序表(底層實現是數組)和棧結構就會發現,它們存儲數據的方式高度相似,只不過棧對數據的存取過程有特殊的限制,而順序表沒有。

例如,我們先使用順序表(a 數組)存儲 {1,2,3,4},存儲狀態如圖 1 所示:


順序表存儲 {1,2,3,4}
圖 1 順序表存儲 {1,2,3,4}


同樣,使用棧存儲結構存儲 {1,2,3,4},其存儲狀態如圖 2 所示:


棧結構存儲 {1,2,3,4}
圖 2 棧結構存儲 {1,2,3,4}


通過圖 1 和圖 2 的對比不難看出,使用順序表模擬棧結構很簡單,只需要將數據從 a 數組下標為 0 的位置依次存儲即可。

從數組下標為 0 的模擬棧存儲數據是常用的方法,從其他數組下標處存儲數據也完全可以,這里只是為了方便初學者理解。

了解了順序表模擬棧存儲數據后,接下來看如何模擬棧中元素出棧的操作。由於棧對存儲元素出棧的次序有"先進后出"的要求,如果想將圖 1 中存儲的元素 1 從棧中取出,需先將元素 4、元素 3 和元素 2 依次從棧中取出。

這里給出使用順序表模擬棧存儲結構常用的實現思路,即在順序表中設定一個實時指向棧頂元素的變量(一般命名為 top),top 初始值為 -1,表示棧中沒有存儲任何數據元素,及棧是"空棧"。一旦有數據元素進棧,則 top 就做 +1 操作;反之,如果數據元素出棧,top 就做 -1 操作。

順序棧元素"入棧"

比如,還是模擬棧存儲 {1,2,3,4} 的過程。最初,棧是"空棧",即數組是空的,top 值為初始值 -1,如圖 3 所示:


空棧示意圖
圖 3 空棧示意圖


首先向棧中添加元素 1,我們默認數組下標為 0 一端表示棧底,因此,元素 1 被存儲在數組 a[1] 處,同時 top 值 +1,如圖 4 所示:


模擬棧存儲元素 1
圖 4 模擬棧存儲元素 1


采用以上的方式,依次存儲元素 2、3 和 4,最終,top 值變為 3,如圖 5 所示:


模擬棧存儲{1,2,3,4}
圖 5 模擬棧存儲{1,2,3,4}


因此,C 語言實現代碼為:

  1. //元素elem進棧,a為數組,top值為當前棧的棧頂位置
  2. int push(int* a,int top,int elem){
  3. a[++top]=elem;
  4. return top;
  5. }

代碼中的 a[++top]=elem,等價於先執行 ++top,再執行 a[top]=elem。

順序棧元素"出棧"

其實,top 變量的設置對模擬數據的 "入棧" 操作沒有實際的幫助,它是為實現數據的 "出棧" 操作做准備的。

比如,將圖 5 中的元素 2 出棧,則需要先將元素 4 和元素 3 依次出棧。需要注意的是,當有數據出棧時,要將 top 做 -1 操作。因此,元素 4 和元素 3 出棧的過程分別如圖 6a) 和 6b) 所示:


數據元素出棧
圖 6 數據元素出棧

注意,圖 6 數組中元素的消失僅是為了方便初學者學習,其實,這里只需要對 top 值做 -1 操作即可,因為 top 值本身就表示棧的棧頂位置,因此 top-1 就等同於棧頂元素出棧。並且后期向棧中添加元素時,新元素會存儲在類似元素 4 這樣的舊元素位置上,將舊元素覆蓋。

元素 4 和元素 3 全部出棧后,元素 2 才能出棧。因此,使用順序表模擬數據出棧操作的 C 語言實現代碼為:

  1. //數據元素出棧
  2. int pop(int * a,int top){
  3. if (top==-1) {
  4. printf("空棧");
  5. return -1;
  6. }
  7. printf("彈棧元素:%d\n",a[top]);
  8. top--;
  9. return top;
  10. }

代碼中的 if 語句是為了防止用戶做 "棧中已無數據卻還要數據出棧" 的錯誤操作。代碼中,關於對棧中元素出棧操作的實現,只需要 top 值 -1 即可。

總結

通過學習順序表模擬棧中數據入棧和出棧的操作,初學者完成了對順序棧的學習,這里給出順序棧及對數據基本操作的 C 語言完整代碼:

  1. #include <stdio.h>
  2. //元素elem進棧
  3. int push(int* a,int top,int elem){
  4. a[++top]=elem;
  5. return top;
  6. }
  7. //數據元素出棧
  8. int pop(int * a,int top){
  9. if (top==-1) {
  10. printf("空棧");
  11. return -1;
  12. }
  13. printf("彈棧元素:%d\n",a[top]);
  14. top--;
  15. return top;
  16. }
  17. int main() {
  18. int a[100];
  19. int top=-1;
  20. top=push(a, top, 1);
  21. top=push(a, top, 2);
  22. top=push(a, top, 3);
  23. top=push(a, top, 4);
  24. top=pop(a, top);
  25. top=pop(a, top);
  26. top=pop(a, top);
  27. top=pop(a, top);
  28. top=pop(a, top);
  29. return 0;
  30. }

程序輸出結果為:

彈棧元素:4
彈棧元素:3
彈棧元素:2
彈棧元素:1
空棧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM