题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
题解
其实实现思路很简单,就是如题所述,使用两个栈来实现队列
思路
首先来看初始代码。
var CQueue = function() {
};
/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
};
/**
* @return {number}
*/
CQueue.prototype.deleteHead = function() {
};
/**
* Your CQueue object will be instantiated and called as such:
* var obj = new CQueue()
* obj.appendTail(value)
* var param_2 = obj.deleteHead()
*/
初始代码给出了两个原型函数来进行操作,那么需要在队列CQueue中声明两个数字。
this.stack1=[];
this.stack2=[];
然后是入队和出队逻辑。
-
入队: 只需要将数据push进stack1即可。
-
出队: 整体思路是将数组1中的数据全部pop出来,然后push到数组2中。如果数组2中有数据则直接pop即可,否则从数组1中继续push进来,如果1和2都为空则返回-1.
-
- 判断stack2,如果有数据,pop, return;
-
- 如果1失败,循环pop出stack1中的所有数据并且push到stack2中;
-
- 如果前面没有return,这里需要return stack2的pop值,默认为-1.
-
代码
完整代码
var CQueue = function() {
this.stack1=[];
this.stack2=[];
};
/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
this.stack1.push(value);
};
/**
* @return {number}
*/
CQueue.prototype.deleteHead = function() {
if(this.stack2.length) return this.stack2.pop();
while(this.stack1.length){
this.stack2.push(this.stack1.pop())
}
return this.stack2.pop() || -1;
};
/**
* Your CQueue object will be instantiated and called as such:
* var obj = new CQueue()
* obj.appendTail(value)
* var param_2 = obj.deleteHead()
*/