算法记录 | Day10栈与队列

69 阅读3分钟

算法记录-Day10栈与队列

LeetCode 232-用栈实现队列

题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty

题目链接:leetcode.cn/problems/im…

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
解题思路
  • 队列先进先出的特性与栈后进先出的特性想清楚
class MyQueue:

    def __init__(self):
        # stack基本的pop操作
        self.stack_in = []
        self.stack_out = []

    def push(self, x: int) -> None:
        self.stack_in.append(x)
        print(self.stack_in)

    def pop(self) -> int:
        if self.empty():
            return None
        if self.stack_out:
            return self.stack_out.pop()
        else:
            for i in range(len(self.stack_in)):
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out.pop()

    def peek(self) -> int:
        # 取这个元素的值还不能删除这个元素
        ans = self.pop()
        # 将ans这个元素返回去
        self.stack_out.append(ans)
        return ans

    def empty(self) -> bool:
        if self.stack_in or self.stack_out:
            return False
        else:
            return True
难点
  • python如何使用栈:数组就可以表示栈,入栈就用append,出栈用pop()来展现的

LeetCode 1047-删除字符串中的所有相邻重复项

题目描述:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

题目链接:leetcode.cn/problems/re…

输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
解题思路
  • 使用栈,当元素与栈顶元素相同时pop(),否则加入栈
class Solution:
    def removeDuplicates(self, s: str) -> str:
        stack = []
        for i in s:
            # pop()操作时,stack不能为空
            if stack and stack[-1] == i:
                stack.pop()
            else:
                stack.append(i)
        return "".join(stack)

注意:进行pop()操作时,stack不能为空,所以要进行stack的判断。


LeetCode 20-有效的括号

题目描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。

题目链接:leetcode.cn/problems/va…

输入:s = "()[]{}"
输出:true
解题思路
  • 想法与上一题差不多,但是括号需要注意的时,每次需要判断如果时左括号需要入栈的时右括号。
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        for i in s:
            if stack and stack[-1] == i:
                stack.pop()
            else:
                if i == '(':
                    stack.append(')')
                elif i == '[':
                    stack.append(']')
                elif i == '{':
                    stack.append('}')
                else:
                    return False
        if stack:
            return False
        else:
            return True

方法二:使用字典

# 方法二,使用字典
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        mapping = {
            '(': ')',
            '[': ']',
            '{': '}'
        }
        for item in s:
            if item in mapping.keys():
                stack.append(mapping[item])
            elif not stack or stack[-1] != item: 
                return False
            else: 
                stack.pop()
        return True if not stack else False
总结

栈和队列的特性以及基本操作要很熟悉,一般常用的是append,pop();队列是popleft()