資料結構 棧與佇列的知識點by解學武

2021-10-20 05:53:25 字數 2348 閱讀 6050

同順序表和煉表一樣,棧也是用來儲存邏輯關係為 「一對一」 資料的線性儲存結構,如圖 1 所示。

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

棧只能從表的一端訪問資料,另一端是封閉的,如圖 1 所示;

在棧中,無論是存資料還是取資料,都必須遵循"先進後出"的原則,即最先進棧的元素最後出棧。拿圖 1 的棧來說,從圖中資料的儲存狀態可判斷出,元素 1 是最先進的棧。因此,當需要從棧中取出元素 1 時,根據"先進後出"的原則,需提前將元素 3 和元素 2 從棧中取出,然後才能成功取出元素 1。

因此,我們可以給棧下乙個定義,即棧是一種只能從表的一端訪問資料且遵循 「先進後出」 原則的線性儲存結構。

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

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

向棧中新增元素,此過程被稱為"進棧"(入棧或壓棧);

從棧中提取出指定元素,此過程被稱為"出棧"(或彈棧);

棧的具體實現

棧是一種 「特殊」 的線性儲存結構,因此棧的具體實現有以下兩種方式:

順序棧:採用順序儲存結構可以模擬棧儲存資料的特點,從而實現棧儲存結構;

鏈棧:採用鏈式儲存結構實現棧結構;

兩種實現方式的區別,僅限於資料元素在實際物理空間上存放的相對位置,順序棧底層採用的是陣列,鏈棧底層採用的是鍊錶。有關順序棧和鏈棧的具體實現會在後續章節中作詳細講解。

基於棧結構對資料訪問採用 「先進後出」 原則的特點,它可以用於實現很多功能。

例如,我們經常使用瀏覽器在各種**上查詢資訊。假設先瀏覽的頁面 a,然後關閉了頁面 a 跳轉到頁面 b,隨後又關閉頁面 b 跳轉到了頁面 c。而此時,我們如果想重新回到頁面 a,有兩個選擇:

重新搜尋找到頁面 a;

使用瀏覽器的"回退"功能。瀏覽器會先回退到頁面 b,而後再回退到頁面 a。

瀏覽器 「回退」 功能的實現,底層使用的就是棧儲存結構。當你關閉頁面 a 時,瀏覽器會將頁面 a 入棧;同樣,當你關閉頁面 b 時,瀏覽器也會將 b入棧。因此,當你執行回退操作時,才會首先看到的是頁面 b,然後是頁面 a,這是棧中資料依次出棧的效果。

不僅如此,棧儲存結構還可以幫我們檢測**中的括號匹配問題。多數程式語言都會用到括號(小括號、中括號和大括號),括號的錯誤使用(通常是丟右括號)會導致程式編譯錯誤,而很多開發工具中都有檢測**是否有編輯錯誤的功能,其中就包含檢測**中的括號匹配問題,此功能的底層實現使用的就是棧結構。

同時,棧結構還可以實現數值的進製轉換功能。例如,編寫程式實現從十進位制數自動轉換成二進位制數,就可以使用棧儲存結構來實現。

佇列,和棧一樣,也是一種對資料的"存"和"取"有嚴格要求的線性儲存結構。

與棧結構不同的是,佇列的兩端都"開口",要求資料只能從一端進,從另一端出,如圖 1 所示:

通常,稱進資料的一端為 「隊尾」,出資料的一端為 「隊頭」,資料元素進佇列的過程稱為 「入隊」,出佇列的過程稱為 「出隊」。

不僅如此,佇列中資料的進出要遵循 「先進先出」 的原則,即最先進佇列的資料元素,同樣要最先出佇列。拿圖 1 中的佇列來說,從資料在佇列中的儲存狀態可以分析出,元素 1 最先進隊,其次是元素 2,最後是元素 3。此時如果將元素 3 出隊,根據佇列 「先進先出」 的特點,元素 1 要先出佇列,元素 2 再出佇列,最後才輪到元素 3 出佇列。

棧和佇列不要混淆,棧結構是一端封口,特點是"先進後出";而佇列的兩端全是開口,特點是"先進先出"。

因此,資料從表的一端進,從另一端出,且遵循 「先進先出」 原則的線性儲存結構就是佇列。

佇列儲存結構的實現有以下兩種方式:

順序佇列:在順序表的基礎上實現的佇列結構;

鏈佇列:在鍊錶的基礎上實現的佇列結構;

兩者的區別僅是順序表和煉表的區別,即在實際的物理空間中,資料集中儲存的佇列是順序佇列,分散儲存的佇列是鏈佇列。

佇列的實際應用

實際生活中,佇列的應用隨處可見,比如排隊買 ***、醫院的**系統等,採用的都是佇列的結構。

拿排隊買票來說,所有的人排成一隊,先到者排的就靠前,後到者只能從隊尾排隊等待,隊中的每個人都必須等到自己前面的所有人全部買票成功並從隊頭出隊後,才輪到自己買票。這就不是典型的佇列結構嗎?

棧與佇列知識點

一 讀取 include include 棧的標頭檔案 using namespace std intmain 輸入 123 輸出 123 二 刪除 include include 棧的標頭檔案 using namespace std intmain 輸入 123 456 輸出 123 三 判斷棧的...

資料結構 知識點

定義 度 兒子數 分支節點 除了根和葉子的節點 根的深度為1 資料結構的分類 資料結構分為邏輯結構和物理結構。邏輯結構 表現資料之間的關係的一種資料結構,分為線性結構和非線性結構。物理結構 表現資料如何儲存的一種資料結構,通常分為順序結構 鏈式結構 索引結構和雜湊結構。有序表,也叫有序線性表,資料按...

資料結構知識點

1 線性結構與非線性結構 線性結構 線性表,棧,隊 乙個根節點,最多乙個前節點乙個後節點 首節點無前節點,尾接點無後節點 非線性結構 樹形結構,圖形結構 線性表 由一組資料元素構成,資料元素的位置只取決於自己的序號 陣列 棧 限定只能在表的一端進行插入和刪除,先進後出,只能在棧頂進出 佇列 只能在表...