持续创作,加速成长!这是我参与「掘金日新计划 · 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时,将入队栈的元素又全部弹出,依次放入出队栈,然后再判断出队栈是否为空。
感觉这种方法呢,无故多了一些逻辑。完全没有必要。所以舍弃该方案。