下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 09 | 面试题:用队列实现栈&用栈实现队列
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

算法面试通关40讲

共62讲 · 62课时·约600分钟
18906
免费
01 | 合格程序员的第一步:算法...
免费
02 | 如何事半功倍地学习算法与...
免费
03 | 如何计算算法的复杂度
免费
04 | 如何通过LeetCode来进行算...
免费
05 | 理论讲解:数组&链表
06 | 面试题:反转一个单链表&...
07 | 理论讲解:堆栈&队列
08 | 面试题:判断括号字符串是...
09 | 面试题:用队列实现栈&用...
10 | 理论讲解:优先队列
11 | 面试题:返回数据流中的第...
12 | 面试题:返回滑动窗口中的...
13 | 理论讲解:哈希表
14 | 面试题:有效的字母异位词
15 | 面试题:两数之和
16 | 面试题:三数之和
17 | 理论讲解:树&二叉树&二...
18 | 面试题:验证二叉搜索树
19 | 面试题:二叉树&二叉搜索...
20 | 理论讲解:二叉树遍历
21 | 理论讲解:递归&分治
22 | 面试题:Pow(x,n)
23 | 面试题:求众数
24 | 理论讲解:贪心算法
25 | 面试题:买卖股票的最佳时...
26 | 理论讲解:广度优先搜索
27 | 理论讲解:深度优先搜索
28 | 面试题:二叉树层次遍历
29 | 面试题:二叉树的最大和最...
30 | 面试题:生成有效括号组合
31 | 理论讲解:剪枝
32 | 面试题:N皇后问题
33 | 面试题:数独问题
34 | 理论讲解:二分查找
35 | 面试题:实现一个求解平方...
36 | 理论讲解:字典树
37 | 面试题:实现一个字典树
38 | 面试题:二维网格中的单词...
39 | 理论讲解:位运算
40 | 面试题:统计位1的个数
41 | 面试题:2的幂次方问题&...
42 | 面试题:N皇后问题的另一...
43 | 理论理解:动态规划(上)
44 | 理论理解:动态规划(下)
45 | 面试题:爬楼梯
46 | 面试题:三角形的最小路径...
47 | 面试题:乘积最大子序列
48 | 面试题:股票买卖系列
49 | 面试题:最长上升子序列
50 | 面试题:零钱兑换
51 | 面试题:编辑距离
52 | 理论讲解:并查集
53 | 面试题:岛屿的个数&朋友...
54 | 面试题:岛屿的个数&朋友...
55 | 理论讲解: LRU Cache
56 | 面试题:设计和实现一个LR...
57 | 理论讲解:布隆过滤器
58 | 课程重点回顾
59 | FAQ答疑&面试中切题四件...
60 | 回到起点:斐波拉契数列
61 | 白板实战番外篇:斐波拉契...
62 | 最后的一些经验分享

精选留言(19)

  • 2018-10-25
    接着shawn的优化一下。前面的步骤都一样,最后的input output可以不用互换,只需要在每次push/pull/peek操作前判断一下哪个队列不为空,就从不为空的队列开始操作到空的队列即可,省去了一次互换的操作,减少了一倍的时间复杂度。
    6
  • 2018-10-13
    老师能否指点下如何用队列实现栈呢?
    5
  • 2019-07-16
    老师,我刚刚又优化了下速度,因为刚刚在leetcode试了之前的方法才击败了50%,现在这个击败96%
    # -*- coding: UTF-8 -*

    class MyQueue(object):

        def __init__(self):
            """
            Initialize your data structure here.
            """
            self.input_stack = []
            self.output_stack = []
            

        def push(self, x):
            """
            Push element x to the back of queue.
            :type x: int
            :rtype: None
            """
            self.input_stack.append(x)
            

        def pop(self):
            """
            Removes the element from in front of queue and returns that element.
            :rtype: int
            """
            if self.empty():
                return None
            else:
                if len(self.output_stack):
                    return self.output_stack.pop()
                else:
                    # for i in xrange(0, len(self.input_stack)):
                    # self.output_stack.append(self.input_stack.pop())
                    length = len(self.input_stack)
                    self.output_stack = map(lambda x: self.input_stack.pop(), range(0, length))
                    return self.output_stack.pop()
            

        def peek(self):
            """
            Get the front element.
            :rtype: int
            """
            if self.empty():
                return None
            else:
                if len(self.output_stack):
                    return self.output_stack[-1]
                else:
                    # for i in xrange(0, len(self.input_stack)):
                    # self.output_stack.append(self.input_stack.pop())
                    length = len(self.input_stack)
                    self.output_stack = map(lambda x: self.input_stack.pop(), range(0, length))
                    return self.output_stack[-1]
            

        def empty(self):
            """
            Returns whether the queue is empty.
            :rtype: bool
            """
            return bool(len(self.input_stack) == 0 and len(self.output_stack) == 0)
    展开
    2
  • 关于用队列实现栈,大家可以看我写的博客,有两种比较好想的思路:https://blog.csdn.net/zpznba/article/details/83987480
    2
  • 2018-10-23
    队列变栈,应该是两个队列,input和output,入input,出的时候,出input全队放入output中,pop把最后出队的值返回不放回output,peek放回output,然后input output互换,后续操作都如此吧
    2
  • 2018-10-19
    我这提供一个队列实现栈的思路:入栈在非空队列中加入(如果都是空队列任选一个队列加入),出栈和查看栈顶元素,把非空队列元素输入到空队列中,最后一个输入元素就是要出栈或者查看的元素。
    2
  • 2019-05-26
    单队列双队列,都可以用来实现栈哟
    1
  • 2019-04-29
    @tonyBoy:你那个Stack的两个变量根本没有初始化,当然会出错不通过了。
    Stack<Integer> stack1 = new Stack<Integer>();
    起码要这样才行啊。
    1
  • 2019-01-18
    Python版本语言版实现:
        def __init__(self):
            """
            Initialize your data structure here.
            """
            self.input = []
            self.output = []

        def push(self, x):
            """
            Push element x to the back of queue.
            :type x: int
            :rtype: void
            """
            self.input.append(x)

        def pop(self):
            """
            Removes the element from in front of queue and returns that element.
            :rtype: int
            """
            if self.empty():
                return None
            if len(self.output) == 0:
                # self.output为空, self.input不为空,把input的值掉个顺序倒腾到output中去
                long = len(self.input)
                while long > 0:
                    self.output.append(self.input.pop())
                    long -= 1
                return self.output.pop()
            else:
                # self.output不为空, self.input为空
                return self.output.pop()

        def peek(self):
            """
            Get the front element.
            :rtype: int
            """
            if self.empty():
                return None
            if len(self.output) == 0:
                # self.output为空, self.input不为空,把input的值掉个顺序倒腾到output中去
                long = len(self.input)
                while long > 0:
                    self.output.append(self.input.pop())
                    long -= 1
                return self.output[-1]
            else:
                # self.output不为空, self.input为空
                return self.output[-1]

        def empty(self):
            """
            Returns whether the queue is empty.
            :rtype: bool
            """
            if len(self.output) == 0 and len(self.input) == 0:
                return True
            return False
    展开
    1
  • 2019-12-09
    建议stack用push和pop,queue用enqueue和dequeue。
  • 2019-12-01
    队列实现栈:每插一个新数据的时候,把该数据前面的数据都出队,再入队....皮的一
  • 2019-07-16
    老师你好,python版本重新修改一下peek函数,当out_stack里有元素而in_stack里没有元素的情况,应返回out_stack第一个元素
    class QueueByStack(object):
        def __init__(self):
            self.input_stack = []
            self.output_stack = []
            
        def empty(self):
            """
            判断队列为空
            :return: bool
            """
            return bool(len(self.input_stack) == 0 and len(self.output_stack) == 0)

        def push(self, input):
            """
            元素进入队列
            :param input:list
            :return:
            """
            if isinstance(input, list) and len(input):
                for s in input:
                    self.input_stack.append(s)

        def pop(self):
            """
            元素出队列
            :return: 队列出来的第一个元素
            """
            if self.empty():
                return None
            else:
                if len(self.output_stack):
                    return self.output_stack.pop()
                else:
                    for i in xrange(0, len(self.input_stack)):
                        self.output_stack.append(self.input_stack.pop())
                    return self.output_stack.pop()

        def peek(self):
            """
            查看队列的最后一个元素
            :return: 队列的最后一个元素
            """
            if self.empty():
                return None
            else:
                if len(self.output_stack):
                    return self.input_stack[-1] if len(self.input_stack) else self.output_stack[0]
                else:
                    for i in xrange(0, len(self.input_stack)):
                        self.output_stack.append(self.input_stack.pop())
                    return self.output_stack[0]
    展开
  • 2019-07-16
    老师我试了下python版本,欢迎指正
    class QueueByStack(object):
        def __init__(self):
            self.input_stack = []
            self.output_stack = []

        def push(self, input):
            """
            元素进入队列
            :param input:list
            :return:
            """
            if isinstance(input, list) and len(input):
                for s in input:
                    self.input_stack.append(s)

        def pop(self):
            """
            元素出队列
            :return: 队列出来的第一个元素
            """
            if len(self.input_stack):
                if len(self.output_stack):
                    return self.output_stack.pop()
                else:
                    for i in xrange(0, len(self.input_stack)):
                        self.output_stack.append(self.input_stack.pop())
                    return self.output_stack.pop()
            else:
                return None

        def peek(self):
            """
            查看队列的最后一个元素
            :return: 队列的最后一个元素
            """
            if len(self.input_stack):
                if len(self.output_stack):
                    return self.input_stack[-1]
                else:
                    for i in xrange(0, len(self.input_stack)):
                        self.output_stack.append(self.input_stack.pop())
                    return self.output_stack[0]
            else:
                return None
    展开
  • 2019-04-01
    Java语言实现版,在push时候做翻转
    class MyStack {

    Queue<Integer> queue=new LinkedList<Integer>();

            /** Push element x onto stack. */
            public void push(int x) {
                Queue<Integer> temp=new LinkedList<Integer>();
                while (!queue.isEmpty()){
                    temp.add(queue.poll());
                }
                queue.add(x);
                while (!temp.isEmpty()){
                    queue.add(temp.poll());
                }
            }

            /** Removes the element on top of the stack and returns that element. */
            public int pop() {
                return queue.poll();
            }

            /** Get the top element. */
            public int top() {
                return queue.peek();
            }

            /** Returns whether the stack is empty. */
            public boolean empty() {
                return queue.isEmpty();
            }
    }
    展开

    作者回复: 赞!

    1
  • 2019-01-28
    这种对于(abc)就没法检测了吧
  • 2019-01-19
    老师,请问能讲下链表的递归吗
  • 2018-12-20
    class MyQueue {
        
       Stack<Integer> Input,Output;
        /** Initialize your data structure here. */
        public MyQueue() {
            
        }
        
        /** Push element x to the back of queue. */
        public void push(int x) {
            if(Output.empty()){ Output.push(x);}
            else{
                while(!Output.empty()){
                    Input.push(Output.peek());
                    Output.pop();
                }
                Input.push(x);
                while(!Input.empty()){
                    Output.push(Input.peek());
                    Input.pop();
                }
            }
        }
        
        /** Removes the element from in front of queue and returns that element. */
        public int pop() {
           int temp=Output.peek();
            Output.pop();
            return temp;
        }
        
        /** Get the front element. */
        public int peek() {
            return Output.peek();
        }
        
        /** Returns whether the queue is empty. */
        public boolean empty() {
            return Output.empty();
        }

    }
    麻烦大家帮我看一下哪里有错,为什么提交不上去
    展开
  • 2018-12-12
    GO语言版实现:

    type MyQueue struct {
        inStack []int
        outStack []int
    }

    /** Initialize your data structure here. */
    func Constructor() MyQueue {
        return MyQueue{
            inStack: make([]int, 0),
            outStack: make([]int, 0),
        }
    }

    /** Push element x to the back of queue. */
    func (this *MyQueue) Push(x int) {
        this.inStack = append(this.inStack, x)
    }

    /** Removes the element from in front of queue and returns that element. */
    func (this *MyQueue) Pop() int {
        for _, v := range this.inStack {
            this.outStack = append(this.outStack, v)
        }
        this.inStack = make([]int, 0)
        v := this.outStack[0]
        this.outStack = this.outStack[1 : len(this.outStack)-1]
        return v
    }

    /** Get the front element. */
    func (this *MyQueue) Peek() int {
        for _, v := range this.inStack {
            this.outStack = append(this.outStack, v)
        }
        this.inStack = make([]int, 0)
        return this.outStack[0]
    }

    /** Returns whether the queue is empty. */
    func (this *MyQueue) Empty() bool {
        return len(this.inStack) != 0 || len(this.outStack) != 0
    }

    /**
     * Your MyQueue object will be instantiated and called as such:
     * obj := Constructor();
     * obj.Push(x);
     * param_2 := obj.Pop();
     * param_3 := obj.Peek();
     * param_4 := obj.Empty();
     */
    展开

    作者回复: 👍🏻👍🏻

  • 2018-10-13
    好久没学算法,贴出来的代码一下子不好理解,需要补课了