1. 程式人生 > >大話數據結構 棧與隊列

大話數據結構 棧與隊列

引用 pty 建議 自己的 clas 有一個 empty 函數 我們

棧是限定僅在表尾進行插入和刪除操作的線性表。

我們把允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不含任何數據元素的棧稱為空棧。棧又稱為後進先出的線性表,簡稱LIFO結構。

棧的插入操作,叫作進棧,也稱壓棧、入棧。

棧的刪除操作,叫作出棧,也有的叫作彈棧。

棧的抽象數據類型

ADT    棧(stack)
Data
        同線性表。元素具有相同的類型,相鄰元素具有前驅和後繼關系。
Operation
        InitStack(*S):    初始化操作,建立一個空棧S。
        DestroyStack(*S):    若棧存在,則銷毀它。
        ClearStack(
*S): 將棧清空。 StackEmpty(S): 若棧為空,返回True,否則返回False。 GetTop(S,*e): 若棧存在且非空,用e返回S的棧頂元素。 Push(*S,e): 若棧S存在,插入新元素e到棧S中並成為棧頂元素。 Pop(*S,*e): 刪除棧S中棧頂元素,並用e返回其值。 StackLength(S): 返回棧S的元素個數。 endADT

棧的順序存儲結構:以首元素作為棧底。兩棧共享空間可以提高空間利用率。

棧的鏈式存儲結構:把棧頂放在單鏈表的頭部,用棧頂作為頭結點。

如果棧的使用過程中元素變化不可預料,有時很小,有時非常大,那麽最好是用鏈棧,反之,如果它的變化在可控範圍內,建議使用順序棧會更好一點。

棧的應用——遞歸

我們把一個直接調用自己或通過一些列的調用語句間接地調用自己的函數,稱為遞歸函數。

每個遞歸函數定義必須至少有一個條件,滿足時遞歸不再進行,即不再引用自身而是返回值輸出。(避免無窮遞歸)

例子:斐波拉契數列。

棧的應用——四則運算表達式求值

1)將中綴表達式轉化為後綴表達式(棧用來進出運算的符號);

規則:從左到右遍歷中綴表達式的每個數字和符號,若是數字就輸出,即成為後綴表達式的一部分;若是符號,則判斷其與棧頂符號的優先級,是右括號或優先級不高於棧頂符號則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出後綴表達式為止。

2)將後綴表達式進行運算得出結果(棧用來進出運算的數字)。

規則:從左到右遍歷表達式的每個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。

大話數據結構 棧與隊列