JS 剑指Offer(六) 用两个栈实现队列
题目:用两个栈实现队列,实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数,若队列中没有元素deleteHead返回-1
分析:在队列的尾部插入元素很简单,直接用栈的push就可以实现,但是在头部删除一个元素就不简单了,虽然大家可能都会想到在JS中可以直接调用shift方法,但是题目要求我们用两个栈,便是让我们手写一下shift。我们分别用instack和outstack来保存入队元素和出队元素,删除头部元素的时候,把入栈元素全部push进outstack里,这时候outstack里就保存了原队列的倒序数组,这个时候用pop取出最后一个元素并返回,即实现了deleteHead。
1 var CQueue = function(){ 2 this.inStack = [] 3 this.outStack = [] 4 } 5 6 CQueue.prototype.appendTail = function(value){ 7 //加入元素 可以直接向instack里面push 8 this.inStack.push(value) 9 } 10 11 CQueue.prototype.deleteHead = function(){ 12 const {inStack,outStack} = this; 13 //const inStack = this.inStack const outStack = this.outStack 14 if(outStack.length){ 15 return outStack.pop() 16 //两个栈 一个instack 一个outstack 我想要删除队列头部的元素 用一个栈是不行的 17 //要把instack里的元素倒进outstack里,然后取第一个元素 18 }else{ 19 while(inStack.length){ 20 outStack.push(inStack.pop()); 21 } 22 return outStack.pop() || -1 23 } 24 }
测试
1 var obj = new CQueue() 2 obj.appendTail(1) 3 obj.appendTail(2) 4 console.log(obj)//[1,2] 5 6 obj.deleteHead() 7 console.log(obj)//[2]