题解 | #用两个栈实现队列#

用两个栈实现队列

http://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6

算法思想:双栈(此题已明确解题方法即双栈)

解题思路:

借助栈的先进后出规则模拟实现队列的先进先出
1、当插入时,直接插入 stack1
2、当弹出时,当 stack2 不为空,弹出 stack2 栈顶元素,如果 stack2 为空,将 stack1 中的全部数逐个出栈入栈 stack2,再弹出 stack2 栈顶元素

图解


代码展示:

Python版本
class Solution:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []
    def push(self, node):
        # write code here
        self.stack1.append(node)
    def pop(self):
        # return xx
        if self.stack2 == []:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2.pop()
JAVA版本:
import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(node);
    }
    
    public int pop() {
        if (stack2.size() <= 0){
            while (stack1.size() != 0){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}
C++版本:
class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {
        if (stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        int node = stack2.top();
        stack2.pop();
        return node;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

复杂度分析:

时间复杂度:对于插入和删除操作,时间复杂度均为 O(1)。插入不多说,对于删除操作,虽然看起来是 O(n)O(n) 的时间复杂度,但是仔细考虑下每个元素只会「至多被插入和弹出 stack2 一次」,因此均摊下来每个元素被删除的时间复杂度仍为 O(1)。
空间复杂度O(N):辅助栈的空间,最差的情况下两个栈共存储N个元素


全部评论
java有问题吧,先push进入一列元素1,2,3,再pop一下得出1,此时再push一个元素4,看看是不是出问题了
4 回复 分享
发布于 2022-06-22 10:08
python版本中为什么一定要加if和while语句呢?有没有好大哥能讲解一下的
点赞 回复 分享
发布于 2021-08-24 21:27
java版本思路是没问题的,我也是这么写的,但是运行就报空指针异常,复制粘贴你的代码也是。但是我的代码在我的idea上能正常运行
点赞 回复 分享
发布于 2021-08-30 17:11
要求:存储n个元素的空间复杂度为 O(n)O(n) ,插入与删除的时间复杂度都是 O(1)O(1)
点赞 回复 分享
发布于 2022-06-28 15:19
python的代码没问题吗?虽然题目的两个测试用例通过,但先push进入一列元素1,2,3,再pop一下得出1,此时再push一个元素4,难道没问题?感觉还是官方题解,pop后,再循环一次把stack2的元素还给stack1才能行
点赞 回复 分享
发布于 2022-08-08 16:34
写的时候就觉得stack1中的空了再插入怎么办,看来大家都和我有一样的问题
点赞 回复 分享
发布于 2023-12-18 19:55 日本
class Solution: def __init__(self): self.stack1 = [] self.stack2 = [] def push(self, node): self.stack1.append(node) def pop(self): return self.stack1.pop(0)
点赞 回复 分享
发布于 03-24 23:10 广东

相关推荐

11-09 17:30
门头沟学院 Java
TYUT太摆金星:我也是,好几个华为的社招找我了
点赞 评论 收藏
分享
评论
51
25
分享
牛客网
牛客企业服务