题目来源
题目链接如下:点击跳转
题目介绍
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例
输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
提示
- 1 <= values <= 10000
- 最多会对 appendTail、deleteHead 进行 10000 次调用
解题思路
- 题目要求两个栈实现一个队列
- 栈的特点:
– 先进后出 - 队列的特点:
– 先进先出 - 栈的示意图:
- 队列的示意图
1、初步设想,若将一个栈当作出队,一个栈当作入队,效果应该和队列作用相同。
2、将设想具体,两个栈实现相反的功能,可以得出,栈内元素排序相反。
3、进一步抽象,两个栈实现一个队列,即元素相同,可以共用一组元素。
4、当其中一个栈正序入栈时,相当于队列的入队。
该栈进行出栈,并将出栈元素放入另一个栈时,另一个栈此时实现了倒序,即可完成队列的出队。
5、问题得以解决。
代码实现
java
class CQueue {
Stack<Integer> in;
Stack<Integer> out;
public CQueue() {
in = new Stack<Integer>();
out = new Stack<Integer>();
}
public void appendTail(int value) {
in.push(value);
}
public int deleteHead() {
if(!in.empty()){
while(!in.empty()){
out.push(in.pop());
}
int headElement = out.pop();
while(!out.empty()){
in.push(out.pop());
}
return headElement;
}else{
return -1;
}
}
}
代码优化
可以看出,out栈的栈顶元素即为队列队首元素,上述代码中每一次删除队首元素,都会将out栈重新倒序输出到in栈,而两个栈都为一个队列,大可不必该操作,从而降低复杂度。
class CQueue {
Stack<Integer> in;
Stack<Integer> out;
public CQueue() {
in = new Stack<Integer>();
out = new Stack<Integer>();
}
public void appendTail(int value) {
in.push(value);
}
public int deleteHead() {
if(!(in.empty() && out.empty())){
if(!out.empty()){
int headElement1 = out.pop();
return headElement1;
}else{
while(!in.empty()){
out.push(in.pop());
}
int headElement2 = out.pop();
return headElement2;
}
}else{
return -1;
}
}
}
问题得以解决,如有更好思路欢迎评论,私聊。