20. 有效的括號
題目鏈接:https://leetcode.cn/problems/valid-parentheses/
解答: https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html
有效字符串需滿足:
1. 左括號必須用相同類型的右括號閉合兵罢。
2. 左括號必須以正確的順序閉合族壳。
3. 注意空字符串可被認為是有效字符串。
return false 的情況:
第一種情況:已經(jīng)遍歷完了字符串趣些,但是棧不為空仿荆,說明有相應(yīng)的左括號沒有右括號來匹配,所以return false
第二種情況:遍歷字符串匹配的過程中,發(fā)現(xiàn)棧里沒有要匹配的字符拢操。所以return false
第三種情況:遍歷字符串匹配的過程中锦亦,棧已經(jīng)為空了,沒有匹配的字符了令境,說明右括號沒有找到對應(yīng)的左括號return false
return true的情況:
字符串遍歷完之后杠园,棧是空的,就說明全都匹配了舔庶。
http://www.reibang.com/p/ae28d514003c
由于歷史原因抛蚁,在Java中,官方不建議使用Stack類惕橙,而是使用Deque代替瞧甩,也就是說,接口Deque是棧和雙端隊列這兩種數(shù)據(jù)結(jié)構(gòu)的集合體弥鹦。
關(guān)于LinkedList/Dequue中的添加和刪除操作:
· add 和 remove 是一對肚逸,源自Collection,所以添加到隊尾彬坏,從隊頭刪除朦促;
· offer 和 poll是一對,源自Queue栓始,(先進先出 => 尾進頭出)务冕,所以添加到隊尾,從隊頭刪除幻赚;
· push 和 pop是一對禀忆,源自Deque,其本質(zhì)是棧坯屿,先進后出 => 頭進頭出),所以添加到隊頭巍扛,從隊頭刪除领跛;
· offerFisrt/offerLast 和 pollFirst/pollLast是一對,源自Deque撤奸,其本質(zhì)是雙端隊列吠昭,offerFirst添加到隊頭,offerLast添加到隊尾胧瓜,pollFirst從隊頭刪除矢棚,pollLast從隊尾刪除;
1047. 刪除字符串中的所有相鄰重復(fù)項
題目鏈接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
我們在刪除相鄰重復(fù)項的時候府喳,其實就是要知道當(dāng)前遍歷的這個元素蒲肋,我們在前一位是不是遍歷過一樣數(shù)值的元素,那么如何記錄前面遍歷過的元素呢?
所以就是用棧來存放兜粘,那么棧的目的申窘,就是存放遍歷過的元素,當(dāng)遍歷當(dāng)前的這個元素的時候孔轴,去棧里看一下我們是不是遍歷過相同數(shù)值的相鄰元素剃法。
注意??:
1. ArrayDeque會比LinkedList在除了刪除元素這一點外會快一點
參考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
ArrayDeque<Character>deque=new ArrayDeque<>();
2. 最后所有字符出棧的時候,是按照從后往前的順序出棧的
str=deque.pop()+str; // String str;
sb.reverse(); // StringBuffer sb;
150. 逆波蘭表達式求值
題目鏈接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
逆波蘭表達式:是一種后綴表達式路鹰,所謂后綴就是指運算符寫在后面贷洲。
逆波蘭表達式主要有以下兩個優(yōu)點:
1、去掉括號后表達式無歧義晋柱,上式即便寫成 1 2 + 3 4 + * 也可以依據(jù)次序計算出正確結(jié)果优构。
2、適合用棧操作運算:遇到數(shù)字則入棧趣斤;遇到運算符則取出棧頂兩個數(shù)字進行計算俩块,并將結(jié)果壓入棧中。
遞歸就是用棧來實現(xiàn)的:所以棧與遞歸之間在某種程度上是可以轉(zhuǎn)換的浓领!?這一點我們在后續(xù)講解二叉樹的時候玉凯,會更詳細的講解到。那么來看一下本題联贩,其實逆波蘭表達式相當(dāng)于是二叉樹中的后序遍歷漫仆。 大家可以把運算符作為中間節(jié)點,按照后序遍歷的規(guī)則畫出一個二叉樹泪幌。
中綴表達式對于計算機來說不友好盲厌,二后綴表達式計算機可以利用棧來順序處理,不需要考慮優(yōu)先級了祸泪。也不用回退了吗浩,?所以后綴表達式對計算機來說是非常友好的。
注意??:除法和減法的兩個運算數(shù)是有先后順序的
除法:
int temp1=stack.pop();
int temp2=stack.pop();
stack.push(temp2/temp1);