堆疊 一文讀懂

2021-09-27 04:47:20 字數 1370 閱讀 3650

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

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

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

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

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

有效字串需滿足:

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

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

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

解題思路:

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

就以這個思路實現乙個初版**,這個**的時間複雜度o(n),空間複雜度o(n)搞定:

class solution ' );

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

for(int i=0;i繼續思考有沒有更簡潔的方法,竟然在leetcode上找到了乙個。

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

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

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

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

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

一文讀懂Nginx

問 nginx的負載均衡演算法有什麼?預設是什麼演算法?答 1 輪詢 按請求的時間輪詢查空閒的後端伺服器 2 指定輪詢機率 機率的原因是後端伺服器的效能不均勻,好的多分點,差的少分點 3 固定ip繫結固定伺服器 預設是加權輪詢,就是優先訪問權重高的伺服器 問 nginx是單執行緒的嗎?答 是單執行緒...

一文讀懂SpringMVC

主要講的是dispatcherservlet這個類 ioc其實是乙個map,工程啟動後掃瞄路徑,根據類的全限定名建立bean 問 怎麼根據路徑找到方法?map還存key為 aaa value為該controller例項 問 autowired原理?自定義註解,在載入的時候,掃瞄controller層...

一文讀懂kafka

kafka如何保證訊息可靠性 kafka具有高吞吐量 分割槽機制 高容錯率 解決併發消費問題 高可靠性 副本備份 的優點,主要應用於以下三點 介面非同步解耦 減少請求時間 行為分析 記錄使用者行為進行分析 日誌收集 producer 生產者,負責發布訊息到broker customer 消費者,從b...