[栈和队列]用队列实现栈

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

原文链接:225. 用队列实现栈

具体描述:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。

  • int pop() 移除并返回栈顶元素。

  • int top() 返回栈顶元素。

  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。

  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:

[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]

[[], [1], [2], [], [], []]

输出:
[null, null, null, 2, 2, false]

解释:

MyStack myStack = new MyStack();

myStack.push(1);

myStack.push(2);

myStack.top(); // 返回 2

myStack.pop(); // 返回 2

myStack.empty(); // 返回 False

提示:

  • 1 <= x <= 9

  • 最多调用100 次 push、pop、top 和 empty

  • 每次调用 pop 和 top 都保证栈不为空

进阶:你能否仅用一个队列来实现栈。

二、思路分析

栈和队列的基础知识!

两种方式:

第一种利用两个队列来实现:
暂且两个队列的名称分别是queue1(主队列)和queue2(辅助队列),针对push操作的时候,先添加到辅助队列queue2中,然后把queue1的元素都放倒queue2中,然后queue1等于queue2,queue2清空,这样的话先放到queue2中,说明每次添加的元素都是queue2的队头,这样不就是后进先出了嘛!然后pop,peek,empty都可以用queue1来操作就可以了!

第二种利用单个队列来实现:

这时候我们利用双端队列就可以了,在pop方法中,我们每次把队列的头部 放到队列的尾部就可以了,注意需要移动size - 1次!最后一个元素就是栈顶!

三、AC代码

两个栈实现队列:

class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;// 辅助队列

    public MyStack() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }
    
    public void push(int x) {
        queue2.offer(x);// 把队尾放到第一个
        while (!queue1.isEmpty()){
            queue2.offer(queue1.poll());// 把之前的元素放到queue2中!
        }
        Queue<Integer> tmp = queue1;
        queue1 = queue2;// 把结果放到queue1中
        queue2 = tmp;// 保持queue2是空元素,从而是得每次存储的元素都是队头!
    }
    
    public int pop() {
        return queue1.poll();
    }

    public int top() {
        return queue1.peek();
    }
    
    public boolean empty() {
        return queue1.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */
复制代码

利用双端队列实现栈:

class MyStack {
    Deque<Integer> deque;

    public MyStack() {
        deque = new ArrayDeque<>();
    }
    
    public void push(int x) {
        deque.addLast(x);
    }
    
    public int pop() {
       int size = deque.size() - 1;// 保留最后一个元素,因为最后一个元素就是栈顶元素
       while (size-- > 0){
           deque.addLast(deque.pollFirst());
       }
       int res = deque.peekFirst();
       deque.pollFirst();
       return res;
    }

    public int top() {
        return deque.peekLast();
    }
    
    public boolean empty() {
        return deque.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */
复制代码

四、总结

  • 单边队列和双端队列的用法!

感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享