代码随想录训练营第十天 | 232. 用栈实现队列、225. 用队列实现栈

108 阅读2分钟

232. 用栈实现队列 - 力扣(LeetCode)

1. 文章链接

代码随想录 (programmercarl.com)

2. 看到题目的第一想法

两个栈确实可以做队列, 入队相当于进入栈A,

出队时,检查是否有元素,如果有元素,则必然在A中,将A的所有元素pop()到放入到B中,然后再B.pop()一次。

B.pop()结束后,再将B的其余元素全部pop()回A。

3. 看完代码随想录之后的想法

不需要在B.pop()结束后再全部pop()回A。

而是如果有元素,先看B中是否有元素,没有就将A全部pop到B中再B.pop(),但是如果有先B.pop()

class MyQueue:

    def __init__(self):
        self.in_stack = list()
        self.out_stack = list()

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

    def pop(self) -> int:
        if self.empty():
            return None
        else:
            if len(self.out_stack) == 0:
                while len(self.in_stack) > 0:
                    self.out_stack.append(self.in_stack.pop())
            return self.out_stack.pop()

    def peek(self) -> int:
        if self.empty():
            return None
        else:
            if len(self.out_stack) == 0:
                while len(self.in_stack) > 0:
                    self.out_stack.append(self.in_stack.pop())
            return self.out_stack[-1]

    def empty(self) -> bool:
        if len(self.in_stack) == 0 and len(self.out_stack) == 0:
            return True
        else:
            return False


# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

4. 实现过程中遇到的困难

5.学习时长

30分钟

225. 用队列实现栈 - 力扣(LeetCode)

1. 文章链接

代码随想录 (programmercarl.com)

2. 看到题目的第一想法

两个队列deque,一个输入输出队列,一个中间暂存队列。

当入栈的时候,向输入队列append就行,

当出栈时,将所有输入输出队列元素从队首出来存到中间暂存队列里,直到输入输出队列就剩一个元素。

这个元素就能是栈顶元素,直接popleft就可以.

然后输入输出队列就是现在的中间暂存队列,中间暂存队列就是现在已经空了的输入输出队列。

class MyStack:

    def __init__(self):
        self.io_queue = deque()
        self.cache_queue = deque()

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

    def pop(self) -> int:
        if self.empty():
            return None
        while len(self.io_queue) > 1:
            self.cache_queue.append(self.io_queue.popleft())
        top_ele = self.io_queue.popleft()
        self.io_queue, self.cache_queue = self.cache_queue, self.io_queue
        return top_ele

    def top(self) -> int:
        if self.empty():
            return None
        while len(self.io_queue) > 1:
            self.cache_queue.append(self.io_queue.popleft())
        top_ele = self.io_queue.popleft()
        self.io_queue, self.cache_queue = self.cache_queue, self.io_queue
        self.io_queue.append(top_ele)
        return top_ele


    def empty(self) -> bool:
        if self.io_queue:
            return False
        else:
            return True


# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

3. 看完代码随想录之后的想法

和我的想法差不多。

4. 实现过程中遇到的困难

无。

5.学习时长

24分钟。