1.题目

622. 设计循环队列

难度中等229收藏分享切换为英文接收动态反馈
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

示例:
MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3 circularQueue.enQueue(1); // 返回 true circularQueue.enQueue(2); // 返回 true circularQueue.enQueue(3); // 返回 true circularQueue.enQueue(4); // 返回 false,队列已满 circularQueue.Rear(); // 返回 3 circularQueue.isFull(); // 返回 true circularQueue.deQueue(); // 返回 true circularQueue.enQueue(4); // 返回 true circularQueue.Rear(); // 返回 4

提示:

  • 所有的值都在 0 至 1000 的范围内;
  • 操作数将在 1 至 1000 的范围内;
  • 请不要使用内置的队列库。

    2.题解

    解题思路

保存变量,如果想要构造一个循环队列,首先构造一个队列,他需要一个arr来存储队列的数值,以及他的容量,当前队列中的数量,以及头指针,因为要构造循环队列,其实就是不断的移动头指针,每次要加入的值就是加入头指针+count 对队列求余的位置的位置。

构造环的形式,最主要的两个代码:


headIndex = (this.head + this.count) % this.capacity
tailIndex = (this.head + this.count - 1) % this.capacity;

代码

  1. /**
  2. * @param {number} k
  3. */
  4. var MyCircularQueue = function(k) {
  5. this.arr = [];
  6. this.capacity = k;
  7. this.count = 0;
  8. this.head = 0;
  9. };
  10. /**
  11. * @param {number} value
  12. * @return {boolean}
  13. */
  14. MyCircularQueue.prototype.enQueue = function(value) {
  15. if(this.capacity === this.count) {
  16. return false;
  17. }
  18. this.arr[(this.head + this.count) % this.capacity] = value;
  19. this.count++;
  20. return true;
  21. };
  22. /**
  23. * @return {boolean}
  24. */
  25. MyCircularQueue.prototype.deQueue = function() {
  26. if(this.count > 0) {
  27. this.head = (this.head + 1) % this.capacity;
  28. this.count--;
  29. return true;
  30. }
  31. return false;
  32. };
  33. /**
  34. * @return {number}
  35. */
  36. MyCircularQueue.prototype.Front = function() {
  37. if(this.count > 0) {
  38. return this.arr[this.head];
  39. }
  40. return -1;
  41. };
  42. /**
  43. * @return {number}
  44. */
  45. MyCircularQueue.prototype.Rear = function() {
  46. if(this.count > 0) {
  47. return this.arr[(this.head + this.count - 1) % this.capacity];
  48. }
  49. return -1;
  50. };
  51. /**
  52. * @return {boolean}
  53. */
  54. MyCircularQueue.prototype.isEmpty = function() {
  55. return this.count === 0;
  56. };
  57. /**
  58. * @return {boolean}
  59. */
  60. MyCircularQueue.prototype.isFull = function() {
  61. return this.count === this.capacity;
  62. };
  63. /**
  64. * Your MyCircularQueue object will be instantiated and called as such:
  65. * var obj = new MyCircularQueue(k)
  66. * var param_1 = obj.enQueue(value)
  67. * var param_2 = obj.deQueue()
  68. * var param_3 = obj.Front()
  69. * var param_4 = obj.Rear()
  70. * var param_5 = obj.isEmpty()
  71. * var param_6 = obj.isFull()
  72. */