算法通关村——栈与队列相互实现问题

1 用栈实现队列

首先我们先回顾一下栈的队列的基本特征,栈:先进后出;队列:先进先出。那么如何将他们相互转换呢? 

LeetCode232和225有两题,分别是用栈实现队列和用队列实现栈。

232题目如下

由于栈是先进后出,当我们把一组数字,连续进入两次栈内会发生什么,假设第一个数,第一遍先进后出,第二遍后进先出。 那么最后这个数字就是最先出来的,也是最先进来的。和队列里是一样的,先进先出。

所以我们思路已有,将一组数进入两次栈内,出栈顺序就和第一遍栈顺序一样。我们也就可以设置两个堆栈,一个赋值进栈的instack,一个负责出栈的outstack,我们将instack弹出outstack,然后outstack出栈就是想要的结果了。

这里入栈的话,就进到instack就好了,出栈的话就outstack弹栈就OK,那么这里什么时候将instack的元素送到outstack里呢?我们肯定不能instack进一个数,就送到outstack,这样的话,还是先进后出。我们要在出栈的时候,且outstack里是空的时候,将instack里的outstack里。

代码如下:

class MyQueue {
    Deque<Integer> inStack;
    Deque<Integer> outStack;
    public MyQueue() {
        inStack = new LinkedList<Integer>();
        outStack = new LinkedList<Integer>();
    }
    public void push(int x) {
        inStack.push(x);
    }
    public int pop() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.pop();
    }
    public int peek() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.peek();
    }
    public boolean empty() {
        return inStack.isEmpty() && outStack.isEmpty();
    }
    private void in2out() {
        while (!inStack.isEmpty()) {
            outStack.push(inStack.pop());
        }
    }
}

2 用队列实现栈

这个相对简单一点。由于栈是后进先出,所以当我们用队列先进先出实现时候,我们设置两个队列,一个负责保存入队元素之前的元素集放入队头q1,另一个队负责将该入队元素到队尾q2,这样刚入队的元素就可以最先出队,实现后进先出。进栈元素入队q2后,将另一对列q1的元素全部入队到q2中,然后q1和q2对列互换,方便下次使用

代码如下:

class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    public MyStack() {
        queue1 = new LinkedList<Integer>();
        queue2 = new LinkedList<Integer>();
    }

    public void push(int x) {
        queue2.offer(x);
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }

    public int pop() {
        return queue1.poll();
    }

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值