演算法一看就懂之 堆疊

2022-07-04 14:48:14 字數 1743 閱讀 3108

一、「 堆疊 」是什麼?

堆疊(stack)是一種先進後出的、操作受限的線性表,也可以直接稱為

可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出( last in-first out )的原則。

因此「 棧 」雖然是線性的,有2個端:頂端和底端,但它只允許從一端進行插入和刪除資料,這就是為啥前面說「 棧 」是操作受限的了。

只有兩種操作:push 和 pop 。我們用push(壓入)來表示往棧中插入資料,也叫入棧,用pop(彈出)來表示從棧中刪除資料,也叫出棧。我們可以既可以用 「 陣列 」 來實現乙個棧,也可以用 「 鍊錶 」 來實現乙個棧。

二、「 堆疊 」的演算法實踐?

我們來看乙個基於用來完成的演算法題(**leetcode)

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

有效字串需滿足:

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

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

舉例:字串 "()"有效、"(){}"有效、"(]"無效、"([)]"無效、""有效。

解題思路:

使用1個堆疊即可解決,依次遍歷這個字串,如果遇到是左括號就入棧到堆疊中,如果遇到的是右括號,則從堆疊中取出棧頂的第乙個左括號,比對一下這個左括號和當前遇到的右括號是否匹配,如果不匹配這認為這整個字串無效。如果能匹配,則ok,刪除這個左括號和右括號,繼續往後走,繼續遍歷字串中剩下的字元,只要遇到左括號就入棧,只要遇到右括號就與將棧頂的左括號出棧與之比較。一直走到字串結束,再來檢查堆疊中是否還有元素,如果還有元素,則這個字串同樣無效,如果堆疊為空,則字串有效。

就以這個思路實現乙個初版**:

class solution else')  || (temp=='['&&c==']') )else}}

return satck.isempty();}}

這個**的時間複雜度o(n),空間複雜度o(n)搞定。

但是想了想,好像**不是很優雅,寫了乙個優化版,提前將左右括號放入到map中,這個方法的時間和空間複雜度跟上面的一樣。

class solution ' );

map.put('[', ']');

for(int i=0;ichar c = s.charat(i);

if(map.containskey(c))else

} return stack.isempty();}}

繼續思考有沒有更簡潔的方法,竟然在leetcode上找到了乙個:

但是這個方法並沒有用到堆疊哦,它的思路是不斷的遍歷這個字串,將字串中的(){}全部調換成空字串,如果最後全部替換完成了,並且字串為空了,就說明字串是有效的,否者就是無效的字串。

class solution ","").replaceall("\\[\\]","");

}while(s.length()!=length);

return s.length()==0;}}

不過這個方法的時間複雜度要高一些。

以上,就是對資料結構中「 堆疊 」的一些思考。

判斷大小簡單演算法 演算法一看就懂之 堆疊

一 堆疊 是什麼?堆疊 stack 是一種先進後出的 操作受限的線性表,也可以直接稱為棧。可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出 last in first out ...

一看就懂的SwitchHosts

switchhosts 是乙個管理 切換多個 hosts 方案的工具。它是乙個免費開源軟體。日常開發工作中,我們可能經常需要切換各種 hosts 繫結,比如在本地開發時可能需要乙個開發環境的 hosts 繫結方案,發布到測試環境後又有乙個測試環境的 hosts 繫結方案,然後可能還有乙個預發布環境,...

一看就懂TCP 連線

我們先來看乙個定義。這樣理解比較抽象。我們換個角度。它的本質還是傳輸控制。如果讓我們自己設計這個傳輸,我們會怎麼想呢。tcp 協議它會先建立連線。三次握手目的是保證雙方都有傳送和接收的能力 首要原因是為了防止舊的重複連線初始化造成混亂。同步雙方初始序列號客戶端和服務端都處於 closed 狀態。先是...