图解LeetCode——剑指 Offer 09. 用两个栈实现队列

简介: 图解LeetCode——剑指 Offer 09. 用两个栈实现队列

一、题目

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

二、示例

示例 1:

【输入】["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]

[[],[3],[],[],[]]

【输出】[null,null,3,-1,-1]

示例 2:

【输入】["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]

[[],[],[5],[2],[],[]]

【输出】[null,-1,null,null,5,2]

提示:

  • 1 <= values <= 10000
  • 最多会对 appendTaildeleteHead 进行 10000 次调用

三、解题思路

  • 因为题目要求,通过2个堆栈的数据结构来实现1个队列的数据结构,那么要解答这道题,我们就需要明白栈和队列的相关特性:

】对于元素采用先进后出的操作方式。

队列】对于元素采用先进先出的操作方式。

  • 既然我们了解了栈和队列对于元素维护的操作方式,那么我们其实就可以利用两个栈的先进先出特性模拟出一个队列。即:

stackIn:只负责添加元素操作的栈;

stackOut:只负责获取/移除操作的栈;

  • 那么当添加元素的时候,只需要向栈stackIn添加即可;那么当调用获取元素的时候,我们只需要从stackOut中弹出栈顶元素即可。
  • 那么如果stackOut中为空了怎么办呢?我们会尝试将当前stackIn中所有的元素移动到stackOut中,然后再执行弹出栈顶元素操作。但是,如果stackIn中也为空的话,我们就直接返回-1即可。具体操作逻辑请见下图所示:

  • 最后需要说明一下,就是在题解中,为了提升执行速度,我们没有采用Stack类,而是采用Deque(双向队列)类中的addLast(...)removeLast()方法来模拟栈结构。

四、代码实现

classCQueue {
privateDeque<Integer>stackIn, stackOut;
publicCQueue() {
stackIn=newArrayDeque<>();
stackOut=newArrayDeque();
    }
publicvoidappendTail(intvalue) {
stackIn.addLast(value);
    }
publicintdeleteHead() {
if (!stackOut.isEmpty()) returnstackOut.removeLast();
if (stackIn.isEmpty()) return-1;
while (!stackIn.isEmpty()) 
stackOut.addLast(stackIn.removeLast());
returnstackOut.removeLast();
    }
}


今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
LeetCode 热题100——单调栈
LeetCode 热题100——单调栈
19 0
|
2月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
34 6
|
4月前
【Leetcode 2487】从链表中移除节点 —— 单调栈
解题思路:维持一个单调递增栈,当栈为空时,记录当前节点为头节点;否则当前节点为栈顶节点的后继节点
|
4月前
【Leetcode 1944】队列中可以看到的人数 —— 单调栈
解题思路:维持一个单调递增栈来辅助计算每个人能够看到的人数。从右往左遍历数组,对于每个人,我们将其身高与栈顶元素的身高进行比较。如果当前人的身高比栈顶元素的身高高,则栈顶元素无法被当前人看到,将其出栈,并累计计数
|
4月前
|
存储
leetcode:232. 用栈实现队列
leetcode:232. 用栈实现队列
19 0
LeetCode | 232. 用栈实现队列
LeetCode | 232. 用栈实现队列
|
16天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
17天前
|
算法 定位技术
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
17 0
|
2月前
|
存储
leetcode1944. 队列中可以看到的人数
leetcode1944. 队列中可以看到的人数
16 0
|
2月前
|
算法 安全 Java
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
22 0

热门文章

最新文章