题目描述:

使用栈实现队列的下列操作:

push(x) — 将一个元素放入队列的尾部。 pop() — 从队列首部移除元素。 peek() — 返回队列首部的元素。 empty() — 返回队列是否为空。

解题思路

维护两个栈stack1和stack2。当 stack2 为空、而 stack1 不为空时,我们需要继续把 stack1 中的元素转移到 stack2 中去,然后再从 stack2 里取元素。也就是说,所有的出队操作都只能依赖 stack2 来完成

代码实现

  1. /**
  2. * 初始化构造函数
  3. */
  4. const MyQueue = function () {
  5. // 初始化两个栈
  6. this.stack1 = [];
  7. this.stack2 = [];
  8. };
  9. /**
  10. * Push element x to the back of queue.
  11. * @param {number} x
  12. * @return {void}
  13. */
  14. MyQueue.prototype.push = function (x) {
  15. // 直接调度数组的 push 方法
  16. this.stack1.push(x);
  17. };
  18. /**
  19. * Removes the element from in front of queue and returns that element.
  20. * @return {number}
  21. */
  22. MyQueue.prototype.pop = function () {
  23. // 假如 stack2 为空,需要将 stack1 的元素转移进来
  24. if (this.stack2.length <= 0) {
  25. // 当 stack1 不为空时,出栈
  26. while (this.stack1.length !== 0) {
  27. // 将 stack1 出栈的元素推入 stack2
  28. this.stack2.push(this.stack1.pop());
  29. }
  30. }
  31. // 为了达到逆序的目的,我们只从 stack2 里出栈元素
  32. return this.stack2.pop();
  33. };
  34. /**
  35. * Get the front element.
  36. * @return {number}
  37. * 这个方法和 pop 唯一的区别就是没有将定位到的值出栈
  38. */
  39. MyQueue.prototype.peek = function () {
  40. if (this.stack2.length <= 0) {
  41. // 当 stack1 不为空时,出栈
  42. while (this.stack1.length != 0) {
  43. // 将 stack1 出栈的元素推入 stack2
  44. this.stack2.push(this.stack1.pop());
  45. }
  46. }
  47. // 缓存 stack2 的长度
  48. const stack2Len = this.stack2.length;
  49. return stack2Len && this.stack2[stack2Len - 1];
  50. };
  51. /**
  52. * Returns whether the queue is empty.
  53. * @return {boolean}
  54. */
  55. MyQueue.prototype.empty = function () {
  56. // 若 stack1 和 stack2 均为空,那么队列空
  57. return !this.stack1.length && !this.stack2.length;
  58. };