查看原文
其他

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

小灰 云时代架构 2019-05-09
    选择“置顶公众号”,精品文章第一时间送达!


本期封面作者:蝉沐风





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













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







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


入栈:



出栈:




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


入队:



出队:




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







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


在模拟入队操作时,每一个新元素都被压入到栈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 -

推荐阅读

  1. 【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?

  2. Spring AOP就是这么简单啦

  3. 可能是全网把 ZooKeeper 概念讲的最清楚的一篇文章

  4. 微服务之服务调用与安全控制

  5. Spring Security权限框架理论与实战(二)

  6. 支付系统

  7. 支付公司账务系统的那些事

  8. 对称加密及AES加密算法

  9. 支付对账系统怎么设计?

  10. 如何健壮你的后端服务

  11. 拜托,面试中请不要让我再写单例模式,小视频全程指导


【推荐书籍】




      


  扫码购买


做互联网时代最适合的架构
开放、分享、协作


扫二维码,持续关注


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存