通过率 71.9%
题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
思路:
栈的特点是后进先出,队列的特点是先进先出
stackA维护入队操作,stackB维护出队操作
- 入队的时候直接压入栈A就行,不必把栈B的值转移到A中后再压入(因为栈A中的值总是比B中的后进,只有B为空时才会将A中的值弹出)
- 出队的时候先判断栈B是否有值,有就直接弹出;否则看栈A中是否有值,没有就返回-1(队列为空),有就将栈A的值转移到B中再弹出
1 /* JavaScript */ 2 var CQueue = function() { 3 CQueue.prototype.stackA = [] 4 CQueue.prototype.stackB = [] 5 }; 6 7 /** 8 * @param {number} value 9 * @return {void} 10 */ 11 CQueue.prototype.appendTail = function(value) { 12 this.stackA.push(value) 13 }; 14 15 /** 16 * @return {number} 17 */ 18 CQueue.prototype.deleteHead = function() { 19 if(this.stackB.length) return this.stackB.pop() 20 else if(!this.stackA.length) return -1 21 else { 22 while(this.stackA.length) this.stackB.push(this.stackA.pop()) 23 return this.stackB.pop() 24 } 25 }; 26 27 /** 28 * Your CQueue object will be instantiated and called as such: 29 * var obj = new CQueue() 30 * obj.appendTail(value) 31 * var param_2 = obj.deleteHead() 32 */