leetcode——用两个栈实现队列

76 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

前言

力扣练习第5天,拒绝思路老化。今天要练习的是用两个栈实现队列

题目信息如下:

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

输入:

["CQueue","appendTail","deleteHead","deleteHead"]

[[],[3],[],[]]

输出:

[null,null,3,-1]

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()
 */

解法

哈哈,有没有觉得好烦呐这些人,队列就队列还非得用双栈实现,数组不香吗?这道题其实主要考大家对栈与队列的熟悉程度。我们都清楚,栈先进后出(FILO),队列先进先出(FIFO)。知道特点那又如何使用双栈实现呢?

我们可以设一个栈存储入队的数据,一个栈存储出队的数据。每当出队时,若出队栈为空时,则将入队栈的数据一次弹出并压入出队栈中,这样出队栈就满足先进先出的特点。

然后,我们仔细看一看输出,每次append的时候我们都需要return null,delete时,需判断队列是否为空,为空return -1

var CQueue = function() {
    this.appendStack = []
    this.deleteStack = []
};

CQueue.prototype.appendTail = function(value) {
    this.appendStack.push(value);
};

CQueue.prototype.deleteHead = function() {
    if(this.deleteStack.length > 0){
        return this.deleteStack.pop();
    }else{
        while(this.appendStack.length){
            this.deleteStack.push(this.appendStack.pop());
        }
        if(this.deleteStack.length === 0){
            return -1;
        }else{
            return this.deleteStack.pop();
        }
    }
};

上述应该是双栈比较简单的写法了,通俗易懂。还有一种,代码我就不写了,给大家说一下实现思路,个人感觉比较复杂,不如这一种好理解。

这种方法呢,做了两次处理。第一次在append时,它先将出队栈的依次弹出并存储入队栈,然后再将append 要添加的值入栈。第二次在delete时,将入队栈的元素又全部弹出,依次放入出队栈,然后再判断出队栈是否为空。

感觉这种方法呢,无故多了一些逻辑。完全没有必要。所以舍弃该方案。