只能在表的同一端進行插入和刪除操作,且操作遵循先進後出原則的線性表稱為棧。
若用 s=(
a1,a
2,a3
,...
,an)
s=(a_1,a_2,a_3,...,a_n)
s=(a1
,a2
,a3
,...
,an
) 表示棧,則:
棧常見的兩種操作:
棧的基本操作用順序儲存方式儲存元素的棧稱為順序棧。
棧指標的設定及棧空、棧滿判斷:
順序棧的初始化
順序棧的入棧
順序棧的出棧
取棧頂元素用鍊錶儲存方式實現的棧稱為鏈式棧。
鏈棧中如何區分棧頂和棧底?
鏈棧操作特點:
鏈棧的初始化
操作步驟如下:
鏈棧的入棧
將資料元素插入到棧頂:
鏈棧的出棧
刪除首元結點:
鏈棧的取棧頂元素
鏈棧的特點
鏈棧不需要頭結點,鍊錶的頭指標指向棧頂,插入和刪除僅在棧頂處執行;
基本不存在棧滿的情況,空棧相當於頭指標指向空。
儲存空間:順序棧在初始化時必須申請儲存空間,若棧不滿時會造成儲存空間的浪費;
鏈式棧所需空間是隨時申請的,比順序棧僅儲存結點相比,需要額外申請空間儲存其指標域。
時間複雜度:只針對棧頂的基本操作(入棧、出棧、棧元素的訪問),順序棧和鏈式棧的時間複雜度均為 o(1
)o(1)
o(1)
。應用場景:在解決某個問題的時候,只要求關心最近一次的操作,並且在操作完成了之後,需要向前查詢到更前一次的操作。
進製轉換:十進位制數字和其他進製之間進行轉換。
表示式求值:實現計算器的計算功能。
括號匹配的檢驗:給出一串由括號組成的字串,判斷所有括號是否滿足兩兩配對。
迷宮求解。
(逆)波蘭表示式求值:根據(逆)波蘭表示式計算結果。
八皇后問題:在 8∗8
8*88∗
8 的西洋棋上擺放 8 個皇后,使其互不攻擊(任意兩個皇后都不在同一行、同一列、同一斜線上),該如何擺放,共有多少種擺放方式。
漢諾塔問題。
1.括號匹配的檢驗
例題:給定乙個只包括 『(』,』)』,』』,』[』,』]』 的字串,判斷字串是否有效。
說明:有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
空字串可被認為是有效字串。
示例 1:
輸入: 「()」
輸出: true
示例 2:
輸入: 「(]」
輸出: false
解題思路:
利用乙個棧,不斷地往裡壓左括號,一旦遇上了乙個右括號,我們就把棧頂的左括號彈出來,表示這是乙個合法的組合,以此類推,直到最後判斷棧裡還有沒有左括號剩餘。
2.每日溫度
例題:根據每日氣溫列表,請重新生成乙個列表,對應位置的輸入是你需要再等待多久溫度才會公升高超過該日的天數。如果之後都不會公升高,請在該位置用 0 來代替。
說明:氣溫列表 temperatures 長度的範圍是 [1, 30000]。
示例:給定乙個陣列 t 代表了未來幾天裡每天的溫度值,要求返回乙個新的陣列 d,d 中的每個元素表示需要經過多少天才能等來溫度的公升高。
給定 t:[23, 25, 21, 19, 22, 26, 23]
返回 d: [ 1, 4, 2, 1, 1, 0, 0]
解題思路:
第乙個溫度值是 23 攝氏度,它要經過 1 天才能等到溫度的公升高,也就是在第二天的時候,溫度公升高到 24 攝氏度,所以對應的結果是 1。接下來,從 25 度到下一次溫度的公升高需要等待 4 天的時間,那時溫度會變為 26 度。
思路 1:最直觀的做法就是針對每個溫度值向後進行依次搜尋,找到比當前溫度更高的值,這樣的計算複雜度就是 o(n
2)o(n^2)
o(n2)。
但是,在這樣的搜尋過程中,產生了很多重複的對比。例如,從 25 度開始往後面尋找乙個比 25 度更高的溫度的過程中,經歷了 21 度、19 度和 22 度,而這是乙個溫度由低到高的過程,也就是說在這個過程中已經找到了 19 度以及 21 度的答案,它就是 22 度。
思路 2:可以運用乙個堆疊 stack 來快速地知道需要經過多少天就能等到溫度公升高。從頭到尾掃瞄一遍給定的陣列 t,如果當天的溫度比堆疊 stack 頂端所記錄的那天溫度還要高,那麼就能得到結果。
對第乙個溫度 23 度,堆疊為空,把它的下標壓入堆疊;
下乙個溫度 24 度,高於 23 度高,因此 23 度溫度公升高只需 1 天時間,把 23 度下標從堆疊裡彈出,把 24 度下標壓入;
同樣,從 24 度只需要 1 天時間公升高到 25 度;
21 度低於 25 度,直接把 21 度下標壓入堆疊;
19 度低於 21 度,壓入堆疊;
22 度高於 19 度,從 19 度公升溫只需 1 天,從 21 度公升溫需要 2 天;
由於堆疊裡儲存的是下標,能很快計算天數;
22 度低於 25 度,意味著尚未找到 25 度之後的公升溫,直接把 22 度下標壓入堆疊頂端;
後面的溫度與此同理。
該方法只需要對陣列進行一次遍歷,每個元素最多被壓入和彈出堆疊一次,演算法複雜度是 o(n
3.八皇后問題
在乙個 n×n 的西洋棋棋盤上放置 n 個皇后,每行乙個並使她們不能互相攻擊。給定乙個整數 n,返回 n 皇后不同的的解決方案的數量。
解題思路:
解決 n 皇后問題的關鍵就是如何判斷當前各個皇后的擺放是否合法。
利用乙個陣列 columns 來記錄每一行裡皇后所在的列。例如,第一行的皇后如果放置在第 5 列的位置上,那麼 columns[0] = 6。從第一行開始放置皇后,每行只放置乙個,假設之前的擺放都不會產生衝突,現在將皇后放在第 row 行第 col 列上,檢查一下這樣的擺放是否合理。
方法就是沿著兩個方向檢查是否存在衝突就可以了。
**實現:
首先,從第一行開始直到第 row 行的前一行為止,看那一行所放置的皇后是否在 col 列上,或者是不是在它的對角線上,**如下。
boolean check(int row, int col, int columns)
}return true;
}
然後進行回溯的操作,**如下。
int count;
int totalnqueens(int n)
void backtracking(int n, int row, int columns)
// 嘗試著將皇后放置在當前行中的每一列
for (int col = 0; col < n; col++)
// 如果不合法,就不要把皇后放在這列中(回溯)
columns[row] = -1;}}
資料結構 05 棧和佇列
棧和佇列主要用於儲存臨時資料,例如階乘計算時的入棧保護。棧 先進後出 filo 佇列 先進先出 fifo python中線性表可以作為棧和佇列的實現結構,list本身可以實現所有棧的操作,但是有些操作是棧沒有的,但是list可以,所以為了資料的安全性有必要對列表做一次外層的封裝來約束資料操作。cla...
資料結構與演算法05 棧 佇列
特點在於只能允許在容器的一端 稱為棧頂端指標,英語 top 進行加入資料 英語 push 和輸出資料 英語 pop 的運算。後進先出 lifo,last in first out 棧描述的是操作,線性表描述的是資料存放鍊錶 操作頭部 順序表 操作尾部 return self.list 是不太合適的 ...
資料結構 棧 棧
可以把棧想像成乙個桶 進棧 就是把和桶口一樣大的燒餅往桶裡面扔 出棧 就是把燒餅拿出來 特點 先進後出。先扔進去的燒餅最後才能拿出來,最後扔進去的燒餅,第乙個拿出來 剛開始top 1 top 1 然後把進棧的元素賦值給data top 入棧操作 void push stack s,int x els...