《資料結構》 棧Stack

2022-07-13 17:18:10 字數 2586 閱讀 3342

一.棧stack:先進後出 filo

1.棧的主要功能是進行資料的儲存和計算 棧是一種容器 是具有特殊限制的鍊錶或陣列

2.棧的儲存方式:

①順序儲存:陣列

空間固定 所以需要預先知道所需要開闢的空間有多大 陣列難以進行擴容 所以導致可用空間是有限的

②鏈式儲存:鍊錶

棧可以理解為鍊錶的頭插頭刪 這種儲存方式便於查詢 又快又方便

3.棧的操作端為棧頂ptop 棧是沒有棧底的概念的

4.棧的基本操作:

①棧的初始化init ②入棧壓棧push ③出棧pop ④清空棧clear

⑤棧的銷毀destroy ⑥獲得棧頂元素 ⑦棧內總個數 ⑧棧是否為空

具體實現的時候 定義兩個結構體 這樣有利於棧的銷毀的實現 具體**如下:

1 #include2 #include3

4 typedef struct

node

5mystack;

910 typedef struct

node2

11stack;

1516

void s_init(stack**ppstack)

1722

23void s_push(stack* pstack,int

n)24

3435

int s_pop(stack*pstack)

3648

49void s_clear(stack*pstack)

5055}56

57void s_destroy(stack**pstack)

5863

64 mystack* s_gettop(stack*pstack)

6568

69int s_getcount(stack*pstack)

7073

74int s_isempty(stack*pstack)

7578

79int

main()

80

二.棧的應用

1.括號匹配問題:給一串如 ((())((()))) 這樣的字串 讓我們判斷括號數目是否匹配 就可以利用乙個棧來解決這樣的問題

解決:每當遇到「(」就入棧 遇到「)」就把棧中的乙個「(」出棧

當棧中沒有「(」可以出棧 或是 棧中最後剩餘「(」沒有括號與之進行匹配的時候 就說明這一串字串括號是不匹配的 否則 括號匹配

2.遞迴就是乙個入棧出棧的過程

ps:遞迴的適用場合:當處理大規模資料和處理小規模資料的方法一致時 可以使用遞迴

①著名的遞迴問題:斐波那契數列fibonacci

f(1)=f(2)=1

f(n)=f(n-1)+f(n-2)

1 #include2

3int fib(intn)4

10}1112

intmain()

13

當遞迴呼叫的次數較少時 輸出結果還可以正常的輸出 但是當n為40 50甚至更大的時候 程式的執行就速度會沒有那麼快 可能會卡一段時間

所以不妨利用迴圈的方式來解決遞迴問題

②利用迴圈來解決fibonacci問題

當n大於等於3的時候 可以把f(n)理解為c 把f(n-1)理解為b 那麼f(n-2)即為a

利用迴圈 從3開始 不斷的去更新a b和c這三個變數的值 去計算f(n)的值

實現**如下:

1 #include2

3int fib(intn)4

18return

c;19}20

}2122int

main()

23

③遞迴和迴圈的比較

遞迴:利用遞迴來解決實際問題 會很慢

因為遞迴就是函式呼叫的過程 函式呼叫就是乙個壓棧出棧的問題 所以無論是時間還是空間都消耗巨大

但是遞迴的優點就是**量少 實現起來只要邏輯理解了 就很簡單

迴圈:迴圈相比遞迴利用的時間和空間就會小一些 但是劣勢也很明顯 就是**量比較多

其實 利用棧和迴圈是可以替代遞迴的 陣列也可以 只不過陣列的話 需要提前預知開闢空間大小

④解決乙個問題的最好方法 可能永遠是數學問題吧 斐波那契數列的解決方法也有數學方法 這裡就不說了 我自己理解起來都費勁

3.逆波蘭表示法:四則運算

這裡主要是 中綴表示式和字尾表示式之間的相互轉換 先介紹一下規則

①中綴轉字尾規則:借助輔助棧

遇到數字或者字元直接列印

遇到符號 將符號與棧頂元素進行優先順序比較:如果當前元素優先順序高 則直接入棧 如果當前元素優先順序低 則將棧內元素依次出棧

直到比當前元素優先順序低為止 將當前元素入棧

如果遇到「(」 無條件入棧 如果遇到「)」 將棧內元素依次出棧 直到找到「(」為止

②字尾轉中綴規則:借助輔助棧

遇到數字或字元直接入棧

遇到符號 將棧頂元素的下乙個和棧頂元素構成表示式

③中綴轉字尾的簡便做法:

把所有的表示式括起來 然後把符號拿到所在的括號的外面並且去掉所有括號 即為字尾表示式

例如:(6+4)*9-8/2 → (((6+4)*9)-(8/2)) → 64+9*82/-

資料結構 棧(Stack)

只允許在一端進行插入或刪除操作的線性表。首先,棧是一種線性表,但限定這種線性表只能在某一段進行插入和刪除操作。棧頂 top 線性表允許進行插入和刪除的一端。棧底 bottom 固定的,不允許進行插入和刪除的另一端。空棧 不含任何元素。如上圖 a1為棧底元素,an為棧頂元素。由於棧只能在棧頂進行插入和...

資料結構 棧stack

棧的概念與資料結構 棧 有時稱為 後進先出棧 是乙個元素的有序集合,其中新增移除新元素總發生在同一端。這一端通常稱為 頂部 與頂部對應的端稱為 底部 棧的底部很重要,因為在棧中靠近底部的元素是儲存時間最長的。最近新增的元素是最先會被移除的。這種排序原則有時被稱為 lifo,後進先出。它基於在集合內的...

資料結構 棧(Stack)

棧 英語 stack 又稱為堆疊或堆疊,棧作為一種資料結構,它按照先進後出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料 最後乙個資料被第乙個讀出來 由於堆疊資料結構只允許在一端進行操作,因而按照後進先出 lifo last in first out 的...