首页 > 其他 > 详细

队列实现栈

时间:2021-05-08 00:18:59      阅读:18      评论:0      收藏:0      [点我收藏+]

队列实现栈

思路

如果是只有一个元素的话,对于栈和队列而言,那么就可以认为入队、出队过程约等于进栈、出栈过程(仅仅是个人觉得,都只对一个元素在操作)

在这种情况下,可以直接把这个元素放进主队列中

技术分享图片

如果不是第一个元素,后面的元素就需要用到辅助队列了,我的想法是把后来的元素先放进辅助队列,然后依次把主队列中已有的元素出队,并且入队到辅助队列中,图解一下:

如果这个时候1已经在主队列中了,2要入队就要先进入辅助队列

技术分享图片

把主队列中所有的元素出队,并且放入辅助队列中:

技术分享图片

这时候交换两个队列,先看一下交换后的效果:

技术分享图片

这里交换的时候需要注意一个点,不要使用如下代码来交换(惨痛的教训):

mainQueue = supportQueue;
supportQueue.clear();

后来debug的时候发现,第一行代码确实可以做到把主队列赋值为与辅助队列相同的结果

技术分享图片

但是第二步执行完成之后发现,居然都被clear了

技术分享图片

原因是他们是引用数据类型,并且mainQueue = supportQueue;使他们的hashcode是相同的,都指向了同一个内存地址,也就是说如果执行clear都会被执行

正确的方法(这里只说说我改正后的方法)

mainQueue.addAll(supportQueue);
supportQueue.clear();

将辅助队列的元素全部加入到主队列,再清空就可以了

代码实现

public class QStack {
    Queue<Integer> mainQueue;
    Queue<Integer> supportQueue;

    public QStack() {
        mainQueue = new LinkedList<>();
        supportQueue = new LinkedList<>();
    }

    public void push(int x) {
        if (mainQueue.isEmpty())
            mainQueue.offer(x);
        else{
            supportQueue.offer(x);
            while(!mainQueue.isEmpty())
                supportQueue.offer(mainQueue.poll());

            mainQueue.addAll(supportQueue);
            supportQueue.clear();
        }
    }

    public int pop() {
        return mainQueue.isEmpty() ? -1 : mainQueue.poll();
    }

    public int top() {
        return mainQueue.isEmpty() ? -1 : mainQueue.peek();
    }

    public boolean empty() {
        return mainQueue.isEmpty();
    }

测试用例

public static void main(String[] args) {
    QStack qStack = new QStack();
    System.out.println("为空?" + qStack.empty());
    qStack.push(1);
    qStack.push(2);
    qStack.push(3);
    System.out.println("栈顶:" + qStack.top());
    System.out.println("弹出:" + qStack.pop());
    System.out.println("为空?" + qStack.empty());
    System.out.println("弹出:" + qStack.pop());
    System.out.println("弹出:" + qStack.pop());
    System.out.println("为空?" + qStack.empty());
}

技术分享图片

完全符合了栈(后进先出)的特点

队列实现栈

原文:https://www.cnblogs.com/we1yu4n/p/14743033.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!