其實,實現乙個棧結構非常簡單,我們只需要復用上一節我們自己封裝的陣列就可以快速的實現乙個棧的建立。1. 首先,我們先建立乙個棧的藉口,裡面宣告我們需要實現的方法:以陣列的最後乙個元素當成棧頂元素。
public inte***ce stack
注:這裡我們有乙個peek方法,就是檢視棧頂元素,所以我們需要給我們自己封裝的陣列類新增乙個檢視最後乙個元素的方法:
// 獲取最後乙個元素
public e getlast()
2. 封裝我們自己的棧public class arraystackimplements stack
public arraystack()
public int getcapacity()
@override
public int getsize()
@override
public boolean isempty()
@override
public void push(e ele)
@override
public e pop()
@override
public e peek()
@override
public string tostring()
}return res.tostring();}}
注:其中的arraynew
即是我們在上一節自己封裝的陣列類,不知道的同學可以去檢視:
我理解的資料結構(一)—— 不要小看了陣列
因為我在arraynew
中已經實現了動態陣列,所以不用考慮棧長度的問題,這樣我們就自己封裝了乙個棧(注釋在stack
介面中和arraynew
類中足夠詳細)。
這是一道leetcode
上,編號為20的題目,具體題目描述如下:
給定乙個只包括 '(',')','','[',']' 的字串,判斷字串是否有效。
有效字串需滿足:
1.左括號必須用相同型別的右括號閉合。
2.左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
解題思路首先,我們可以把左括號直接壓入棧,不論是小括號、中括號還是大括號。
如果拿到的是右括號,則需要做匹配判斷。
如果字串比較完成,沒有返回false
,則判斷棧是否為空。
解題**如下:
public boolean isvalid(string s) else
char topchar = stack.pop();
if (c == ')' && topchar != '(')
if (c == ']' && topchar != '[')
if (c == '}' && topchar != '}}
return stack.isempty();
}
方法
複雜度push
o(1) 均攤
popo(1) 均攤
peek
o(1)
getsize
o(1)
isempty
o(1)
因為棧的時間複雜度都是o(1)
,所以棧的效能是很高的。
資料結構 棧(Stack)
只允許在一端進行插入或刪除操作的線性表。首先,棧是一種線性表,但限定這種線性表只能在某一段進行插入和刪除操作。棧頂 top 線性表允許進行插入和刪除的一端。棧底 bottom 固定的,不允許進行插入和刪除的另一端。空棧 不含任何元素。如上圖 a1為棧底元素,an為棧頂元素。由於棧只能在棧頂進行插入和...
資料結構 棧stack
棧的概念與資料結構 棧 有時稱為 後進先出棧 是乙個元素的有序集合,其中新增移除新元素總發生在同一端。這一端通常稱為 頂部 與頂部對應的端稱為 底部 棧的底部很重要,因為在棧中靠近底部的元素是儲存時間最長的。最近新增的元素是最先會被移除的。這種排序原則有時被稱為 lifo,後進先出。它基於在集合內的...
資料結構 棧(Stack)
棧 英語 stack 又稱為堆疊或堆疊,棧作為一種資料結構,它按照先進後出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料 最後乙個資料被第乙個讀出來 由於堆疊資料結構只允許在一端進行操作,因而按照後進先出 lifo last in first out 的...