我们知道队列的特点是先入先出,栈的特点是后入先出,那么如何用栈实现队列的功能,又如何用队列实现栈的功能呢,且听我一一道来
我们首先来看用栈实现队列的功能,首先大伙儿要知道队列和栈的特点其实是“相反”,那么要想用栈来实现队列的功能,一个栈肯定是做不到的,我们可以用两个栈来实现,一个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());
}
}