天天看點

資料結構-棧

同順序表和連結清單一樣,棧也是用來存儲邏輯關系為 "一對一" 資料的線性存儲結構,如圖 1 所示。

資料結構-棧

圖 1 棧存儲結構示意圖

從圖 1 我們看到,棧存儲結構與之前所學的線性存儲結構有所差異,這緣于棧對資料 "存" 和 "取" 的過程有特殊的要求:

  1. 棧隻能從表的一端存取資料,另一端是封閉的,如圖 1 所示;
  2. 在棧中,無論是存資料還是取資料,都必須遵循"先進後出"的原則,即最先進棧的元素最後出棧。拿圖 1 的棧來說,從圖中資料的存儲狀态可判斷出,元素 1 是最先進的棧。是以,當需要從棧中取出元素 1 時,根據"先進後出"的原則,需提前将元素 3 和元素 2 從棧中取出,然後才能成功取出元素 1。

是以,我們可以給棧下一個定義,即棧是一種隻能從表的一端存取資料且遵循 "先進後出" 原則的線性存儲結構。

通常,棧的開口端被稱為棧頂;相應地,封口端被稱為棧底。是以,棧頂元素指的就是距離棧頂最近的元素,拿圖 2 來說,棧頂元素為元素 4;同理,棧底元素指的是位于棧最底部的元素,圖 2 中的棧底元素為元素 1。

資料結構-棧

圖 2 棧頂和棧底

進棧和出棧

基于棧結構的特點,在實際應用中,通常隻會對棧執行以下兩種操作:

  • 向棧中添加元素,此過程被稱為"進棧"(入棧或壓棧);
  • 從棧中提取出指定元素,此過程被稱為"出棧"(或彈棧);

棧的具體實作

棧是一種 "特殊" 的線性存儲結構,是以棧的具體實作有以下兩種方式:

  1. 順序棧:采用順序存儲結構可以模拟棧存儲資料的特點,進而實作棧存儲結構;
  2. 鍊棧:采用鍊式存儲結構實作棧結構;

兩種實作方式的差別,僅限于資料元素在實際實體空間上存放的相對位置,順序棧底層采用的是數組,鍊棧底層采用的是連結清單。有關順序棧和鍊棧的具體實作會在後續章節中作詳細講解。

棧的應用

基于棧結構對資料存取采用 "先進後出" 原則的特點,它可以用于實作很多功能。

例如,我們經常使用浏覽器在各種網站上查找資訊。假設先浏覽的頁面 A,然後關閉了頁面 A 跳轉到頁面 B,随後又關閉頁面 B 跳轉到了頁面 C。而此時,我們如果想重新回到頁面 A,有兩個選擇:

  • 重新搜尋找到頁面 A;
  • 使用浏覽器的"回退"功能。浏覽器會先回退到頁面 B,而後再回退到頁面 A。

繼續閱讀