文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么用两个栈实现一个队列

2024-04-02 19:55

关注

这篇文章主要讲解了“怎么用两个栈实现一个队列”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用两个栈实现一个队列”吧!

在正式开始之前,我们先来回顾一下栈和队列的常用方法。

栈(Stack)的常用方法包含以下这些:

怎么用两个栈实现一个队列

队列(Queue)的常用方法包含以下这些:

怎么用两个栈实现一个队列

有了这些前置知识,接下来我们来看今天的题目。

题目描述

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和  deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能,若队列中没有元素,deleteHead 操作返回 -1。

示例 1:

输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1]

示例 2:

输入: ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"] [[],[],[5],[2],[],[]] 输出:[null,-1,null,null,5,2]

提示:

1 <= values <= 10000 最多会对 appendTail、deleteHead 进行 10000 次调用 leetcode:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/

解题思路

这道题目的意思其实很好理解,就是要将先进后出的栈改为先进先出的队列,其实问题中也给出了一些提示,“用两个栈来实现一个队列”。这道题实现的核心思想就是「负负得正」,我们先用一个栈来存入元素(这时最先进入的元素在栈底),然后再将第一个栈中的元素移动到新栈中,此时最先进入的元素就在栈顶了,然后在用第二个栈出栈时,整个执行的顺序就变成了先进先出。

接下来,我们用图解的方式来实现一下整个流程。

步骤一

先将元素入栈到第一个栈中,如下图所示:

怎么用两个栈实现一个队列

步骤二

将第一个栈中的元素都移动到第二个栈中,如下图所示:


怎么用两个栈实现一个队列

步骤三

所有元素从第二个栈中出栈,如下图所示:

怎么用两个栈实现一个队列

小结

从上述图片可以看出,元素添加顺序是 1、2、3,最终经过两个栈之后的出栈顺序也是 1、2、3,这样我们就通过两个栈实现了队列(先进先出)。

怎么用两个栈实现一个队列

实现代码

接下来我们就用代码来实现一下以上思路:

class CQueue {     Stack<Integer> inputStack; // 入栈的容器(添加时操作)     Stack<Integer> outputStack; // 出栈和查询的栈容器      public CQueue() {         inputStack = new Stack();         outputStack = new Stack();     }      // 添加操作     public void appendTail(int value) {         inputStack.push(value);     }      // 删除操作     public int deleteHead() {         if (!outputStack.isEmpty()) {             // 出栈容器不为空             return outputStack.pop();         } else if (!inputStack.isEmpty()) {             // 入栈 stack 全部转移到出栈 stack             while (!inputStack.isEmpty()) {                 outputStack.push(inputStack.pop());             }         }         return outputStack.isEmpty() ? -1 : outputStack.pop();     } }

我们在 LeetCode 中提交以上测试代码,执行结果如下:

怎么用两个栈实现一个队列

注意事项

在整个实现过程中有两个小细节需要特别注意一下:

第 1 个栈只负责入栈(暂存数据),第 2 个栈只负责出栈(最终的队列执行顺序);

每次栈 2 出栈时都要把所有的元素都出完之后,才能从栈 1 中追加(添加)新数据,当栈 2 的数据没有全部出栈完成时,不能将栈 1 的元素入栈到栈  2,这样会导致元素的执行顺序混乱。

感谢各位的阅读,以上就是“怎么用两个栈实现一个队列”的内容了,经过本文的学习后,相信大家对怎么用两个栈实现一个队列这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯