LeetCode 堆疊佇列 —— 括號匹配(20、232、155)
阿新 • • 發佈:2019-01-10
1. 堆疊(stack)
-
20,20. Valid Parentheses,括號匹配,堆疊(python 中使用 list 即可實現表示堆疊,list.append:入棧,list.pop():出棧)實現:
- 左括號(
(、[、{
)入棧; - 右括號(
)、]、}
)出棧; - 遍歷全部字串後,堆疊為空;
class Solution(object): def isValid(self, s): """ :type s: str :rtype: bool """ stack = [] para_map = {')':'(', ']':'[', '}':'{'} for c in s: if c not in para_map: stack.append(c) elif not stack or stack.pop() != para_map.get(c): return False return not stack
- 左括號(
-
- 實現思路:使用兩個棧進行實現,一個是常規的棧(dataStack),一個用來存放截止到每一步的最小值(minStack);
- push:minStack 為空,或壓入的值<=minStack.peek(),則執行壓入;
- pop:dataStack 彈出的值(不可能小於 minStack.peek()) == minStack.peek(),則 minStack 也進行彈出
class MinStack { private Stack<Integer> dataStack; private Stack<Integer> minStack; /** initialize your data structure here. */ public MinStack() { dataStack = new Stack<>(); minStack = new Stack<>(); } public void push(int x) { dataStack.push(x); if (minStack.isEmpty() || x <= minStack.peek()) { minStack.push(x); } } public void pop() { if (dataStack.isEmpty()) { throw new RuntimeException("Stack is empty!"); } Integer retValue = dataStack.pop(); if (retValue.equals(minStack.peek())) { minStack.pop(); } } }
2. 用棧實現佇列
通過棧實現佇列,需要兩個棧,一個輸入棧(輸入棧僅用來輸入,push),一個輸出棧(僅用來輸出,pop和peek):
class MyQueue(object): def __init__(self): self.input_stack = [] self.output_stack = [] def push(self, x): self.input_stack.append(x) # 僅用來輸入 def pop(self): if not self.output_stack: while self.input_stack: self.output_stack.append(self.input_stack.pop()) return self.output_stack.pop() # 僅用來輸出 def peek(self): if not self.output_stack: while self.input_stack: self.output_stack.append(self.input_stack.pop()) return self.output_stack[-1] # 僅用來輸出 def empty(self): return not self.input_stack and not self.output_stack