棧的應用(c )

2021-10-03 22:42:11 字數 1563 閱讀 1619

如果只了解棧的特點我們可能不知道棧的作用,在大學備考計算機二級c語言的時候,學習過棧和佇列,當時只知道棧的特點是後進先出,佇列的特點是先進先出。程式設計過程中並沒有用過棧和佇列,沒有體會到演算法的巧妙。上了研究生為了找工作開始刷leetcode的題目才體會到演算法的巧妙。今天是在俄羅斯的第五個半月,也是我開始刷leetcode的第二遍,這一遍我決定記錄我自己的刷題經驗,以便後來複習,如果能幫助到大家,那更好不過了。

題目一:給定乙個只包括'('')''''['']'的字串,判斷字串是否有效。

有效字串需滿足:

左括號必須用相同型別的右括號閉合。

左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

拿到這個題有可能會想到計算左括號的個數但是這樣空間複雜度會比較大,因為你需要開闢一定的空間來儲存括號的個數。

這個想到用棧還是比較容易的,我們找個棧只存放左括號如果遇到相應的右括號了就出棧,如果最後棧為空就證明全部有效。

class solution }}

}return res;}};

這個方法確實比較笨但是比較容易想到。耗時也比較長2460毫秒。我們再看一遍程式會發現,我們在拿著數挨個比較的過程中,會有很多的重複,如果我們可以想個辦法去掉這些重複就好了,我想過動態規劃,雙指標(解決陣列問題一般就這幾個方法)。能實現,但是效果並不好,參考leetcode上的答案。棧確實比較好實現,這個遞減棧存放的是陣列的索引。為什麼說它必須是遞減的呢?因為我們目的是找溫度高的值離溫度低的值有多遠。如果溫度低於棧頂元素直接將索引入棧代表我們沒有找到溫度公升高的值,如果插入的溫度高於棧頂元素證明我們找到了,然後我們開始出棧計算距離

class solution 

tmp.push(i);//把比它小的數pk下去後自己進棧

}return res;}};

演算法複雜度是o(n),只用了80多毫秒。速度提公升了不少阿。這只是幾個數,數越多了提公升的效果越明顯。

題目三給定乙個經過編碼的字串,返回它解碼後的字串。

編碼規則為: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證為正整數。

題目三是題目一的擴充套件,和題目一不同的就是加了數字和字母不再是單純的去找括號是否匹配,如果沒有題目一作為鋪墊,可能更容易想到的是遞迴。有題目一做鋪墊,我們可以去構造兩個棧,乙個存放數字,乙個存放字母,然後遍歷字串,遇到 [ 就把數字和字母入棧。代表乙個括號內數字和字母組合的開始,遇到] 就把棧頂元素和原來的加(這是精華所在)數字棧和字母棧始終保持只有棧頂元素。

class solution 

s.push(i);

}nums.pop_back();//哨兵迴圈到最後方便出棧

return max1;}};

c語言棧的應用

棧的作用是將遞迴函式轉換成非遞迴函式,由於在階乘中只有乙個引數,把引數入棧即可 int nfact int n 出棧,模擬函式返回過程 while isemptystack stack return res 利用堆疊進行一位表示式的運算 在生活中用的是類似 9 7 8的表示式,這種表示式叫做中綴表示...

棧的應用(c語言)

新增鏈結描述 toc bool bracketcheck char str,int length 括號匹配 else char topelem pop s,topelem 棧頂元素出棧 if str i topelem return false if str i topelem return fal...

C語言棧的應用

c語言棧的應用 棧的作用是將遞迴函式轉換成非遞迴函式,由於在階乘中只有乙個引數,把引數入棧即可。int nfact int n 出棧,模擬函式返回過程 while isemptystack stack return res 利用堆疊進行一位表示式的運算 在生活中用的是類似 9 7 8的表示式,這種表...