1. 程式人生 > >LeetCode 堆疊佇列 —— 括號匹配(20、232、155)

LeetCode 堆疊佇列 —— 括號匹配(20、232、155)

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