一.棧stack:先進後出 filo
1.棧的主要功能是進行資料的儲存和計算 棧是一種容器 是具有特殊限制的鍊錶或陣列
2.棧的儲存方式:
①順序儲存:陣列
空間固定 所以需要預先知道所需要開闢的空間有多大 陣列難以進行擴容 所以導致可用空間是有限的
②鏈式儲存:鍊錶
棧可以理解為鍊錶的頭插頭刪 這種儲存方式便於查詢 又快又方便
3.棧的操作端為棧頂ptop 棧是沒有棧底的概念的
4.棧的基本操作:
①棧的初始化init ②入棧壓棧push ③出棧pop ④清空棧clear
⑤棧的銷毀destroy ⑥獲得棧頂元素 ⑦棧內總個數 ⑧棧是否為空
具體實現的時候 定義兩個結構體 這樣有利於棧的銷毀的實現 具體**如下:
1 #include2 #include34 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 #include23int 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 #include23int 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 的...