剑指 Offer 09. 用两个栈实现队列

130 阅读2分钟

题目

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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.

      1. 判断stack2,如果有数据,pop, return;
      1. 如果1失败,循环pop出stack1中的所有数据并且push到stack2中;
      1. 如果前面没有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()
 */