一、「 堆疊 」是什麼?
堆疊(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 狀態。先是...