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

本期封面作者:蝉沐风





—————  第二天  —————













————————————







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


入栈:



出栈:




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


入队:



出队:




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







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


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


让元素1 “入队”:






让元素2 “入队”:






让元素3 “入队”:






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


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




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




让元素2 “出队”:







让元素4 “入队”:






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


让元素3 “出队”:









让元素4 “出队”:







  1. private Stack<Integer> stackA = new Stack<Integer>();

  2. private Stack<Integer> stackB = new Stack<Integer>();


  3. /**

  4. * 入队操作

  5. * @param element  入队的元素

  6. */

  7. public void enQueue(int element) {

  8.    stackA.push(element);

  9. }


  10. /**

  11. * 出队操作

  12. */

  13. public Integer deQueue() {

  14.    if(stackB.isEmpty()){

  15.        if(stackA.isEmpty()){

  16.            return null;

  17.        }

  18.        transfer();

  19.    }

  20.    return stackB.pop();

  21. }


  22. /**

  23. * 栈A元素转移到栈B

  24. */

  25. private void transfer(){

  26.    while (!stackA.isEmpty()){

  27.        stackB.push(stackA.pop());

  28.    }

  29. }


  30. public static void main(String[] args) throws Exception {

  31.    StackQueue stackQueue = new StackQueue();

  32.    stackQueue.enQueue(1);

  33.    stackQueue.enQueue(2);

  34.    stackQueue.enQueue(3);

  35.    System.out.println(stackQueue.deQueue());

  36.    System.out.println(stackQueue.deQueue());

  37.    stackQueue.enQueue(4);

  38.    System.out.println(stackQueue.deQueue());

  39.    System.out.println(stackQueue.deQueue());

  40. }







—————END—————




喜欢本文的朋友们,欢迎长按下图关注订阅号程序员小灰,收看更多精彩内容