棧與隊列
棧與隊列,在數據結構中也屬於線性表。
棧(Stack)
棧的實現邏輯
棧是一種特殊的表,其特殊在於插入與刪除操作只能在末端(也就是棧頂)進行,因此棧是**後進先出(LIFO)**的線性表。棧的操作也就包含了出棧(Pop),入棧(Push)和獲取棧頂元素(Top)。
棧的實現方式有兩種,一種是數組形式的棧(如下圖),另外一種是鏈表形式的棧。
棧的時間複雜度
操作 | 時間複雜度 |
---|---|
訪問 | O(n) |
搜索 | O(n) |
插入 | O(1) |
刪除 | O(1) |
隊列(Queue)
隊列的實現邏輯
隊列也是一種有特殊要求的線性表。隊列要求只能在隊列的一端進行插入操作,在另一端進行刪除操作,因此隊列是**先進先出(FIFO)**的線性表。
- 隊頭:允許刪除的一端,稱爲對頭;
- 隊尾:允許插入的一端,稱爲隊尾;
- 進隊:向隊伍插入元素,稱爲進隊,新元素進隊後成爲新的隊尾元素;
- 出隊:向隊伍刪除元素,稱爲出隊,元素出隊後,其後繼元素成爲新的對頭元素。
隊列的時間複雜度
操作 | 時間複雜度 |
---|---|
訪問 | O(n) |
搜索 | O(n) |
插入 | O(1) |
刪除 | O(1) |
LeetCode相關題目
LeetCode題目 有效的括號:
題目內容:
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
這是一個考驗棧操作的題目,java代碼實現如下
class Solution {
public boolean isValid(String s) {
if (s.isEmpty()) {
return true;
}
Stack<Character> characters = new Stack<>();
for (char ch : s.toCharArray()) {
if (ch == ')'){
char topCh = characters.empty() ? '-' : characters.pop();
if(topCh != '('){
return false;
}
} else if (ch == '}'){
char topCh = characters.empty() ? '-' : characters.pop();
if(topCh != '{'){
return false;
}
} else if (ch == ']'){
char topCh = characters.empty() ? '-' : characters.pop();
if(topCh != '['){
return false;
}
} else {
characters.push(ch);
}
}
return characters.isEmpty();
}
}