用栈实现队列的功能,用队列实现栈的功能?

我们知道队列的特点是先入先出,栈的特点是后入先出,那么如何用栈实现队列的功能,又如何用队列实现栈的功能呢,且听我一一道来

我们首先来看用栈实现队列的功能,首先大伙儿要知道队列和栈的特点其实是“相反”,那么要想用栈来实现队列的功能,一个栈肯定是做不到的,我们可以用两个栈来实现,一个push栈,一个pop栈,push栈用来添加入队数据,pop栈用来出队数据,不论是入队还是出队的时候都可以加上一个检查和迁移操作,并且迁移必须遵守原则:pop栈为空,然后从push栈往pop栈迁移数据的时候必须一次性全部完成,这样就能满足先入先出的规则了

代码实现如下:

public class StackToQueue {
    private Stack<Integer> pushStack = new Stack<>();
    private Stack<Integer> popStack = new Stack<>();

//数据从push迁移到pop
    private void puToPop() {
        if (popStack.isEmpty()) {
            while (!pushStack.isEmpty()) {
                popStack.push(pushStack.pop());
            }
        }
    }

    public void enqueue(int val) {
        puToPop();
        pushStack.push(val);
    }

    public int dequeue() {
        puToPop();
        return popStack.pop();
    }

    public static void main(String[] args) {
        StackToQueue stackToQueue = new StackToQueue();
        stackToQueue.enqueue(1);
        stackToQueue.enqueue(2);
        System.err.println(stackToQueue.dequeue());
        stackToQueue.enqueue(3);
        stackToQueue.enqueue(4);
        System.err.println(stackToQueue.dequeue());
        System.err.println(stackToQueue.dequeue());
        System.err.println(stackToQueue.dequeue());
    }
}

反过来,用队列实现栈的功能也是一样,需要用两个队列,一个in队列,用来数据压栈,一个out队列,用来数据出栈,压栈正常压,出栈的时候把in队列里的数据全部挨个取出来并且挪到out队列中,但是需要保留最后一个返回,也就时说原本in存放的是12345,把1234挨个取出来丢到out里面去,返回5,然后交换in和out的引用,每一次出队的时候重复这个过程:

public class QueueToStack {
    private Queue<Integer> inQueue = new LinkedList<>();
    private Queue<Integer> outQueue = new LinkedList<>();

    public void push(int val) {
        inQueue.add(val);
    }

    public int pop() {
        while (!inQueue.isEmpty() && inQueue.size() > 1) {
            int val = inQueue.poll();
            outQueue.add(val);
        }
        int val = inQueue.poll();
        Queue<Integer> tmp = inQueue;
        inQueue = outQueue;
        outQueue = tmp;
        return val;
    }

    public static void main(String[] args) {
        QueueToStack queueToStack = new QueueToStack();
        queueToStack.push(1);
        queueToStack.push(2);
        queueToStack.push(3);
        queueToStack.push(4);
        System.err.println(queueToStack.pop());
        System.err.println(queueToStack.pop());
        System.err.println(queueToStack.pop());
        System.err.println(queueToStack.pop());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值