【資料結構】棧的基礎知識(無程式碼)

love_Aym發表於2018-05-04

一、概念

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


注意:

  • 首先棧是個線性表,棧元素具有線性關係,即前驅後繼關係。
  • 始終只能在表尾即是棧頂進行插入和刪除操作,而不是棧底。棧底是固定的,最先進棧的只能在棧底。


進棧出棧的變化形式:

  • 棧對線性表的插入和刪除的位置進行了限定,但沒有對元素進出的時間進行限制。
  • 在不是所有元素都進棧的情況下,事先進去的元素也可以出站,只要保證是棧頂元素出棧就行。

        如有1,2,3個數字依次進棧:

        1進2進3進,3出2出1出

        1進1出,2進2出,3進3出

        1進2進,2出1出,3進3出等工5中變化方式。

因此,如果元素數量多,出棧的變化將會有很多種。


二、棧的抽象資料型別



三、棧的順序儲存結構及實現

  • 用陣列下標為0的一端作為棧底,首元素在棧底,變化最小。
  • 定義top變數來指示棧頂元素在陣列中的位置,必須小於StackSize。
  • 當棧存在一個元素時,top=0。因此通常把空棧的判定條件定位top=-1。

1、進棧:棧頂指標加1,將新插入元素複製給棧頂空間

2、出棧:棧頂指標減1,將要刪除的棧頂元素賦值給e

3、兩棧共享空間

引入:




  • push操作:首先判斷是否已經棧滿,再判斷是棧1還是棧2,分別進行進棧操作即可。



  • pop操作:只判斷是棧1還是棧2,分別再判斷是否為空,再進行彈棧操作。


總結:針對相同資料型別的棧的一個設計上的技巧,同資料型別是前提。



四、棧的鏈式儲存結構及其實現

  • 棧的鏈式儲存結構,簡稱為鏈棧
  • 因為棧是在棧頂來做插入和刪除操作的,所以鏈棧的棧頂放在單連結串列的頭部比較方便。
  • 另外已經有了棧頂在頭部了,單連結串列中比較常用的頭結點(包括頭指標)也就失去了意義,通常對於鏈棧來說,是不需要頭結點的,棧頂直接指向第一個元素。
  • 對於鏈棧來說,基本不存在棧滿的情況,除非記憶體已經沒有可以使用的空間。
  • 空棧,連結串列原定義是頭指標指向空,那麼鏈棧的空其實就是top=NULL。

1、進棧操作:

  1. 把當前的棧頂元素賦值給新結點的直接後繼。
  2. 將新的結點s賦值給棧頂指標。

2、出棧操作:

3、將棧頂結點賦值給p。

4、使得棧頂指標下移一位,指向後一結點。


順序棧和鏈棧的區別及應用場景

1、順序棧和鏈棧的時間複雜度是一樣的,均為O(1)。

2、空間效能:順序棧需要事先確定一個固定的長度,存在村內空間浪給,但是存取是定位很方便。而鏈棧則要求每個 元素都有指標域,增加了記憶體開銷,但是對於棧的長度無限制。

3、如果棧的使用過程中元素變化不可預料,最好用鏈棧,繁殖,如果元素變化在可控範圍內則用順序棧會好一點。(跟陣列和  的區別是一樣的)


五、棧的作用


1、遞迴----斐波那契數列



1)迴圈迭代實現


2)遞迴函式實現


分析:



遞迴定義:把一個直接呼叫給自己或通過一系列的條用語句間接地呼叫自己的函式,稱作遞迴函式。


遞迴和棧的關係:



2、四則運算表示式求值

不需要括號的字尾表示式,也稱為逆波蘭表示。

字尾表示式:所有運算子號都是在運算數字的後面出現。



中綴表示式:所有的運算子號都在兩個數字中間,也就是平常見的表示式






相關文章