用两个栈实现队列

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

  1. /**
  2. * 栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构
  3. * 也就是最新添加的项最早被移除
  4. * 而栈中项的插入(叫做推入)和移除(叫做弹出),只发生在一个位置——栈的顶部
  5. */
  6. /**
  7. * 队列数据结构的访问规则是FIFO(Fist-In-First-Out,先进先出)
  8. * 队列在列表的末端添加项,从列表的前端移除项
  9. */
  10. var CQueue = function() {
  11. // 如题用两个栈
  12. // 定义出的栈
  13. this.outStack = [];
  14. // 定义入的栈
  15. this.inStack=[];
  16. };
  17. /**
  18. * @param {number} value
  19. * @return {void}
  20. */
  21. CQueue.prototype.appendTail = function(value) {
  22. // 直接放到入的栈里面
  23. this.inStack.push(value);
  24. };
  25. /**
  26. * @return {number}
  27. * push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返回修改后数组的长度
  28. *
  29. * pop()方法删除数组的最后一个元素,把数组的长度减1,并且返回它被删除元素的值
  30. * 如果数组变为空,则该方法不改变数组,返回undefined值
  31. */
  32. CQueue.prototype.deleteHead = function() {
  33. // es6的赋值特性
  34. let {outStack, inStack} = this;
  35. // 判断出的栈,是否有元素,没有元素就从入的栈取出一位,放到出的栈里面
  36. if (!outStack.length) {
  37. while(inStack.length) {
  38. // 1-先取出inStack,2-放到outStack
  39. outStack.push(inStack.pop());
  40. }
  41. }
  42. // 这里使用短路写法,直接操作出的栈
  43. // 出的栈没有元素吐出来,那就只能返回-1
  44. return outStack.pop() || -1;
  45. };
  46. /**
  47. * Your CQueue object will be instantiated and called as such:
  48. * var obj = new CQueue()
  49. * obj.appendTail(value)
  50. * var param_2 = obj.deleteHead()
  51. */

已完成 执行用时: 76 ms
输入
[“CQueue”,”appendTail”,”deleteHead”,”deleteHead”,”deleteHead”]
[[],[3],[],[],[]]
输出
[null,null,3,-1,-1]
预期结果
[null,null,3,-1,-1]