用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
难度:简单
/**
* 栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构
* 也就是最新添加的项最早被移除
* 而栈中项的插入(叫做推入)和移除(叫做弹出),只发生在一个位置——栈的顶部
*/
/**
* 队列数据结构的访问规则是FIFO(Fist-In-First-Out,先进先出)
* 队列在列表的末端添加项,从列表的前端移除项
*/
var CQueue = function() {
// 如题用两个栈
// 定义出的栈
this.outStack = [];
// 定义入的栈
this.inStack=[];
};
/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
// 直接放到入的栈里面
this.inStack.push(value);
};
/**
* @return {number}
* push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返回修改后数组的长度
*
* pop()方法删除数组的最后一个元素,把数组的长度减1,并且返回它被删除元素的值
* 如果数组变为空,则该方法不改变数组,返回undefined值
*/
CQueue.prototype.deleteHead = function() {
// es6的赋值特性
let {outStack, inStack} = this;
// 判断出的栈,是否有元素,没有元素就从入的栈取出一位,放到出的栈里面
if (!outStack.length) {
while(inStack.length) {
// 1-先取出inStack,2-放到outStack
outStack.push(inStack.pop());
}
}
// 这里使用短路写法,直接操作出的栈
// 出的栈没有元素吐出来,那就只能返回-1
return outStack.pop() || -1;
};
/**
* Your CQueue object will be instantiated and called as such:
* var obj = new CQueue()
* obj.appendTail(value)
* var param_2 = obj.deleteHead()
*/
已完成 执行用时: 76 ms
输入
[“CQueue”,”appendTail”,”deleteHead”,”deleteHead”,”deleteHead”]
[[],[3],[],[],[]]
输出
[null,null,3,-1,-1]
预期结果
[null,null,3,-1,-1]