漫画:如何用栈实现队列

转载自  漫画:如何用栈实现队列

栈的特点是先入后出,出入元素都是在同一端(栈顶):

入栈:

漫画:如何用栈实现队列

出栈:

漫画:如何用栈实现队列

队列的特点是先入先出,出入元素是在不同的两端(队头和队尾):

入队:

漫画:如何用栈实现队列

出队:

漫画:如何用栈实现队列

既然我们拥有两个栈,那么我们可以让其中一个栈作为队列的入口,负责插入新元素;另一个栈作为队列的出口,负责移除老元素。

漫画:如何用栈实现队列

 

漫画:如何用栈实现队列

 

漫画:如何用栈实现队列

队列的主要操作无非有两个:入队和出队。

在模拟入队操作时,每一个新元素都被压入到栈A当中。

让元素1 “入队”:

漫画:如何用栈实现队列

漫画:如何用栈实现队列

让元素2 “入队”:

漫画:如何用栈实现队列漫画:如何用栈实现队列

漫画:如何用栈实现队列

让元素3 “入队”:

漫画:如何用栈实现队列

 

漫画:如何用栈实现队列

这时候,我们希望最先“入队”的元素1“出队”,需要怎么做呢?

让栈A中的所有元素按顺序出栈,再按照出栈顺序压入栈B。这样一来,元素从栈A弹出并压入栈B的顺序是3,2,1,和当初进入栈A的顺序1,2,3是相反的:

漫画:如何用栈实现队列

此时让元素1 “出队”,也就是让元素1从栈B弹出:

漫画:如何用栈实现队列

让元素2 “出队”:

漫画:如何用栈实现队列

 

漫画:如何用栈实现队列

漫画:如何用栈实现队列

让元素4 “入队”:  

漫画:如何用栈实现队列

 

漫画:如何用栈实现队列

此时的出队操作仍然从栈B弹出元素。

让元素3 “出队”:

漫画:如何用栈实现队列

漫画:如何用栈实现队列

 

漫画:如何用栈实现队列

漫画:如何用栈实现队列

让元素4 “出队”:

 

漫画:如何用栈实现队列

漫画:如何用栈实现队列

 

漫画:如何用栈实现队列漫画:如何用栈实现队列

private Stack<Integer> stackA = new Stack<Integer>();
private Stack<Integer> stackB = new Stack<Integer>();


/**
* 入队操作
* @param element  入队的元素
*/
public void enQueue(int element) {
   stackA.push(element);
}

/**
* 出队操作
*/
public Integer deQueue() {
   if(stackB.isEmpty()){
       if(stackA.isEmpty()){
           return null;
       }
       transfer();
   }
   return stackB.pop();
}

/**
* 栈A元素转移到栈B
*/
private void transfer(){
   while (!stackA.isEmpty()){
       stackB.push(stackA.pop());
   }
}

public static void main(String[] args) throws Exception {
   StackQueue stackQueue = new StackQueue();
   stackQueue.enQueue(1);
   stackQueue.enQueue(2);
   stackQueue.enQueue(3);
   System.out.println(stackQueue.deQueue());
   System.out.println(stackQueue.deQueue());
   stackQueue.enQueue(4);
   System.out.println(stackQueue.deQueue());
   System.out.println(stackQueue.deQueue());

}

 

漫画:如何用栈实现队列

漫画:如何用栈实现队列