日常算法练习题用两个栈实现队列(每天进步一点点系列)
Posted 牛哄哄的柯南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日常算法练习题用两个栈实现队列(每天进步一点点系列)相关的知识,希望对你有一定的参考价值。
题目描述
剑指 Offer 09. 用两个栈实现队列
难度:简单
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
解题思路
题目大意: 本题的的目的就如题目名字一样,用两个栈实现队列。
解题思路:
首先我们要明白栈和队列的区别:
栈:先进后出
队列:先进先出
这样就可以了,我们需要用两个栈来模拟进队列,出队列,进队列和进栈没有什么区别,但是出队列和出栈就是相反的了,这是我们就可以利用这两个队列A(模拟进队列)和B(模拟出队列),进队列的时候就直接往A中push即可,但是出队列的时候我们需要把A从上往下弹出来,并且放到B中,这样操作后顺序就是反的了,我们就可以模拟出队列的情况了。
代码
/**
* Keafmd
*
* @ClassName: ImplementTheQueueWithTwoStacks
* @Description: 用两个栈实现队列
* @author: 牛哄哄的柯南
* @date: 2021-07-20 11:06
*/
class CQueue {
Deque<Integer> stacckA; //入队栈
Deque<Integer> stacckB; //出队栈
public CQueue() {
stacckA = new LinkedList<Integer>();
stacckB = new LinkedList<Integer>();
}
public void appendTail(int value) {
stacckA.push(value);
}
public int deleteHead() {
//判断出队栈是否为空
if(stacckB.isEmpty()){
while(!stacckA.isEmpty()){
//把A(入队栈)倒出来放到B中,然后让B弹出来,就相当于出队列,就是先进先出了
stacckB.push(stacckA.pop());
}
}
if(stacckB.isEmpty()){
return -1;
}else {
//弹出B的栈顶,也就是相当于第一个出队列的
int deleteItem = stacckB.pop();
return deleteItem;
}
}
}
每天进步一点点!
不进则退!
版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
看完如果对你有帮助,感谢点赞支持!
如果你是电脑端,看到右下角的 “一键三连” 了吗,没错点它[哈哈]
加油!
共同努力!
Keafmd
以上是关于日常算法练习题用两个栈实现队列(每天进步一点点系列)的主要内容,如果未能解决你的问题,请参考以下文章