题目链接
题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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]
解题思路
首先理解题目所给实例的字符串数组的意思:CQueue
初始化、appendTail
入队、deleteHead
出队并返回出队元素。也就是说字符串数组就是记录操作的指令,而输入的int数组包含需要入队的元素。这里要注意输出的数组,它并不是指当前队列内元素的状态,而是仅仅指每一个操作的返回情况,实际上只有deleteHead
有返回情况。
其次就是用双栈实现队列的进队入队的思路了。要清楚这两种数据结构的特点,栈是先进后出,队列是先进先出。显然单一的栈是不能实现队列的进队入队操作滴~那么如何利用双栈呢?举一个例子,1,2,3
元素按序进入第一个栈input
,此时input
从栈顶到栈底的元素依次为3,2,1
。现在想要实现出队顺序为1,2,3
,将第一个栈的元素依次出栈并入栈到第二个栈output
,此时output
从栈顶到栈底的元素依次为1,2,3
,显然此时出栈的顺序为1,2,3
,即利用了双栈实现了队列操作。
最后就是三个函数的功能设计了。
- 题目不要求我们在初始化时候做事情,所以构造函数
CQueue
可以不用管;- 根据实例我们发现入队
appendTail
不要求返回值,仅仅进队就好。所以一行入栈代码即可解决;deleteHead
出队操作就需要一丢丢分析了,不仅要求元素出队,还要返回出队的元素,而且队空时要返回-1
if-else逻辑- 如果
input
和output
均为空,说明此时队列为空,返回-1
;- 否则无论此时
input
是否为空,只要output
不为空,就说明output
还有未出栈的元素,优先操作output
;- 否则,
output
为空而input
不为空,需要将input
元素全部压入output
中,再操作output
。
现在给出c++和JavaScript版本代码~
c++
class CQueue {
public:
CQueue() {
}
void appendTail(int value) {
input.push(value);
}
int deleteHead() {
if(input.empty() && output.empty()) //双栈均为空
return -1;
else if(!output.empty()){ //output栈不为空,说明还有未出队的元素
int result = output.top();
output.pop();
return result;
}
else{ //output栈为空,再执行删除需要input元素出栈入栈
while(!input.empty()){
int value = input.top();
input.pop();
output.push(value);
}
int result = output.top();
output.pop();
return result;
}
}
private:
stack<int> input;
stack<int> output;
};
JavaScript
var CQueue = function() {
this.output = [];
this.input = [];
};
/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
this.input.push(value);
};
/**
* @return {number}
*/
CQueue.prototype.deleteHead = function() {
const {input, output} = this; //es6 解构赋值
if(!output.length && !input.length){
return -1;
}
else if(output.length){
return output.pop();
}
else{
while(input.length){
output.push(input.pop());
}
return output.pop();
}
};
如果有错误或者不严谨的地方,请务必给予指正,十分感谢。