資料結構學習 棧和佇列

2021-09-24 13:51:44 字數 1871 閱讀 5664

是限定僅在表尾進行插入和刪除操作的線性表。我們把插入和刪除的一段稱為棧頂,另一端稱為棧底,不含任何元素的棧稱為空棧。由於棧本身是乙個線性表,因此棧的儲存方式也有兩種,分別是順序儲存和鏈式儲存。

​ 既然棧是線性表的特列,那麼棧的順序儲存其實也是線性表順序儲存的簡化。我們稱為順序棧

​ (1)兩棧的共享空間

此時,當棧1為空時,top1等於-1,當top2等於n時,此時棧2為空。若棧2時空棧,棧1 top1等於n-1時,棧1就滿了。如果棧1為空棧,top2等於0時,棧2滿。

​ 鏈棧的儲存結構如圖所示,棧頂放在單鏈表的頭部。因為有了棧頂在頭部,單鏈表就不需要頭結點了。對於鏈棧來說基本不會存在空間被佔滿的問題。

​ 棧在程式設計中很重要的乙個應用:在程式語言中實現了遞迴。什麼時遞迴,可以去了解一下斐波那契數列。

​ 遞迴的定義:把乙個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱為遞迴函式。每個遞迴定義都必須至少有乙個條件,滿足時遞迴不再進行,即不再引用自身而是返回值退出。

佇列是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先入先出的線性表,簡稱fifo。執行插入的叫隊尾,執行刪除的叫隊頭。

​ (1)所謂的入隊操作,其實就是在隊尾追加乙個元素,而不需要移動任何元素,因此它的時間複雜度為o(1)。

​ (2)與棧不同的是,佇列元素出隊是在隊頭,即下標為0處,那就意味著所有元素都需要向前移動,以保證佇列的對頭不為空,此時時間複雜度為o(n)。

​ 我們把頭尾相接的順序儲存結構的佇列稱為迴圈佇列。迴圈佇列可以解決佇列出隊效能差的問題。

​ 迴圈佇列引入兩個指標,front指向頭元素,rear指向隊尾元素的下乙個位置。當rear等於front時則隊列為空。假設長度為5的陣列,初始狀態front與rear指標均是下標為0的位置,入隊a1、a2、a3、a4後如圖所示:

​ 出隊a1、a2,則front指標指向下標為2的位置,rear不變。此時再入隊a5則會造成陣列越界錯誤,但佇列中還有空閒的空間,此現象稱為*「假溢位」*。

如何解決「假溢位」的現象?

​ 解決的方法只需要將溢位的元素再從頭開始,頭尾相接。當入隊a6時,將它放在下標為0處。rear指標指向下表為1處,當rear和front指標重合時則佇列滿了。

1、現實應用中哪些場景用到佇列和棧這兩種資料結構

2、迴圈佇列佇列滿了和空時,都是rear==front,如何區分呢?

資料結構學習筆記 棧 佇列 (習題)

1.引言 本文主要講解棧和佇列的一些常見的面試題。2.一些常見的面試題 2.1 題目 輸入兩個整數序列。其中乙個序列表示棧的push順序,判斷另乙個序列有沒有可能是對應的pop順序。為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。比如輸入的push序列是1 2 3 4 5,那麼4 5 ...

資料結構學習之棧 佇列等

gdb除錯段錯誤 1.ulimit c unlimited 2.ulimit c 1000 3.gcc 檔案 g 4.執行程式 a.out 生成core檔案 5.gdb a.out core 順序棧1.出棧 datatype popseqstack seqstack stack 功能 從順序棧中出棧...

資料結構學習筆記 棧與佇列

二 佇列 總結參考文獻 棧和佇列的資料操作範圍僅限於邏輯上特定的某端,棧先進後出,佇列先進先出。操作介面 功能返回型別 size 報告棧的規模 intempty 判斷棧是否為空 bool push e 將e插至棧頂 void pop 刪除棧頂物件 ttop 引用棧頂物件 t include vect...