Stack

stack是一種先進後出(Last-In-First-Out, LIFO)的概念。我們可以把這個概念想像成一個向上堆疊的碗盤,若要取出位於最下面的碗,則必須先把上面的碗盤給取出。

Stack通常是一個陣列或鏈表,並實現了以下三種操作:

  1. push: 將一個元素放入Stack的頂部。
  2. pop: 從Stack的頂部移除一個元素。
  3. peek/top: 返回Stack頂部元素的值,但不移除它。

如何使用Stack?

  • Python內置的list
stack = []
stack.append(A) # stack=[A]
stack.append(B) # stack=[A,B]
b = stack.pop() # stack=[A] 先進後出,所以B會先被pop出來,stack內只剩A
print(b)        # B
  • collections模塊中的deque

import collections
stack = collections.deque()
stack.append(A) # stack=[A]
stack.append(B) # stack=[A,B]
b = stack.pop() # stack=[A] 先進後出,所以B會先被pop出來,stack內只剩A
print(b)        # B

20. Valid Parentheses

這題需要判斷一個只包含括號的字符串是否為有效的。有效的字符串必須滿足三個條件:

  1. 開放括號必須由相同類型的括號關閉。
  2. 開放括號必須按正確的順序關閉。
  3. 每個關閉括號必須有對應的相同類型的開放括號。

735. Asteroid Collision

每個數字的絕對值表示其大小,正負號表示其方向(正表示向右移動,負表示向左移動),每個小行星的速度相同。如果兩個小行星相遇,它們會發生碰撞,大的小行星會吃掉小的小行星,如果它們的大小相同,它們都會消失。兩個向同一方向移動的小行星永遠不會相遇。

例如,輸入數組 [5, 10, -5],第二個和第三個小行星會相遇,並且大的小行星會吃掉小的小行星,因此最後的狀態為 [5, 10]。

例如,輸入數組 [8, -8],第一個和第二個小行星會相遇,並且它們的大小相同,因此它們都會消失,最後的狀態為 []。

這題可以使用 Stack 。當遍歷數組時,如果當前小行星為正數,或者當前 Stack 為空或 Stack 最上面的元素為負數,則將當前小行星append Stack 中。否則,如果 Stack 最上面的元素的大小小於當前小行星的大小,則pop Stack 最上面的元素並繼續處理當前小行星,直到 Stack 最上面的元素的大小不小於當前小行星的大小或 Stack 為空為止。最終 Stack 中剩下的小行星即為最終狀態。

844. Backspace String Compare

這題要求判斷兩個字符串在類似於文本編輯器中進行回刪操作(使用“#”表示回刪字符)後,是否相等。如果相等,則返回 True,否則返回 False。例如,對於輸入字符串 s = “ab#c”,t = “ad#c”,回刪操作後,它們都變成了“ac”,因此它們相等。

要解決這個問題,可以用 Stack 。當遍歷字符串時,如果當前字符不是回刪字符,則放到 Stack 中;如果當前字符是回刪字符,則將 Stack 最上面的元素pop出。最後,比較兩個 Stack 中剩下的元素是否相等。

1614. Maximum Nesting Depth of the Parentheses

1381. Design a Stack With Increment Operation