我们知道队列的特点是先入先出,栈的特点是后入先出,那么如何用栈实现队列的功能,又如何用队列实现栈的功能呢,且听我一一道来
我们首先来看用栈实现队列的功能,首先大伙儿要知道队列和栈的特点其实是“相反”,那么要想用栈来实现队列的功能,一个栈肯定是做不到的,我们可以用两个栈来实现,一个push栈,一个pop栈,push栈用来添加入队数据,pop栈用来出队数据,不论是入队还是出队的时候都可以加上一个检查和迁移操作,并且迁移必须遵守原则:pop栈为空,然后从push栈往pop栈迁移数据的时候必须一次性全部完成,这样就能满足先入先出的规则了
代码实现如下:
public class StackToQueue {private Stack<Integer> pushStack = new Stack<>();private Stack<Integer> popStack = new Stack<>();//数据从push迁移到popprivate 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());}
}