數據結構與算法學習-02棧與隊列

棧與隊列

  棧與隊列,在數據結構中也屬於線性表。

棧(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題目 有效的括號

題目內容:

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字符串可被認爲是有效字符串。

這是一個考驗棧操作的題目,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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章