首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >漫画:如何用栈实现队列?

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

作者头像
小灰
发布2022-07-05 15:55:29
发布2022-07-05 15:55:29
2820
举报
文章被收录于专栏:程序员小灰程序员小灰

本期封面作者:蝉沐风

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

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

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

入栈:

出栈:

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

入队:

出队:

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

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

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

让元素1 “入队”:

让元素2 “入队”:

让元素3 “入队”:

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

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

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

让元素2 “出队”:

让元素4 “入队”:

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

让元素3 “出队”:

让元素4 “出队”:

代码语言:javascript
复制
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());
}

—————END—————

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小灰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档