基本介绍

image.png
队列是一种先进先出的数据结构,新元素始终被添加在队列的末尾,删除的时候只能移除队头的第一个元素。

实现队列

  1. class Queue{
  2. constructor(){
  3. this.data = []
  4. }
  5. enQueue(x){
  6. this.data.push(x)
  7. // console.log(this.data)
  8. }
  9. deQueue(){
  10. this.data.shift()
  11. // console.log(this.data)
  12. }
  13. front(){
  14. return this.data[0]
  15. }
  16. isEmpty(){
  17. return this.data.length === 0
  18. }
  19. }
  20. const queue1 = new Queue()
  21. queue1.enQueue(2)
  22. queue1.enQueue(3)
  23. queue1.enQueue(4)
  24. queue1.deQueue()
  25. queue1.deQueue()
  26. queue1.deQueue()
  27. queue1.deQueue()

循环队列的设计

可以使用固定大小的数组和两个指针 headtail 来指示起始位置和结束位置。
起始位置:此时 head tail都等于 -1
image.png
仅有一个元素,此时head等于tail
image.png
队满的时候
image.png
出队
image.png
出队只剩一个元素的时候
image.png
对空的时候

tail理应是在head后面,当tail下次移动将追上head时,证明tail已经无处可去,自然此时队列是满的,即移动tail的下一位置是head时说明队列已满(循环操作可用取余或者直接等于nums[0]);
移动head出队,假如此时head等于tail,说明队列中仅有一个元素,出队就可以了。

代码设计思路:
初始状态 让head 和 tail 都等于 0的位置。
每次入队的时候要判断当前队列是否是满的,如果是满的就加不进去,如果不满就入队成功。
出队的时候是否为空、是否只有一个元素、以及其他情况。

  1. /**
  2. * @param {number} k
  3. */
  4. var MyCircularQueue = function(k) {
  5. this.list = new Array(k) // 判断的时候需要将尾指针加1
  6. this.front = -1
  7. this.rear = -1
  8. this.size = k
  9. };
  10. /**
  11. * @param {number} value
  12. * @return {boolean}
  13. */
  14. MyCircularQueue.prototype.enQueue = function(value) {
  15. if(this.isFull()){ // 满
  16. return false
  17. }else if(this.isEmpty()){ // 空
  18. this.head += 1
  19. this.rear += 1
  20. this.list[this.rear] = value
  21. return true
  22. }else{
  23. this.rear = (this.rear + 1) % this.list.length
  24. this.list[this.rear] = value
  25. // this.rear = (this.rear + 1) % this.list.length
  26. return true
  27. }
  28. };
  29. /**
  30. * @return {boolean}
  31. */
  32. MyCircularQueue.prototype.deQueue = function() {
  33. if(this.isEmpty()){ // 空
  34. return false
  35. }else if(this.head === this.rear){ // 证明只有一个元素了
  36. this.head = -1
  37. this.rear = -1
  38. return true
  39. }else{
  40. this.head = (this.head + 1 ) % this.list.length
  41. return true
  42. }
  43. };
  44. /**
  45. * @return {number}
  46. */
  47. MyCircularQueue.prototype.Front = function() {
  48. if(this.isEmpty()){
  49. return -1
  50. }else{
  51. return this.list[this.front]
  52. }
  53. };
  54. /**
  55. * @return {number}
  56. */
  57. MyCircularQueue.prototype.Rear = function() {
  58. if(this.isEmpty()){
  59. return -1
  60. }else{
  61. return this.list[this.rear]
  62. }
  63. };
  64. /**
  65. * @return {boolean}
  66. */
  67. MyCircularQueue.prototype.isEmpty = function() {
  68. return this.front === this.rear === -1 ? true : false
  69. };
  70. /**
  71. * @return {boolean}
  72. */
  73. MyCircularQueue.prototype.isFull = function() {
  74. if((this.rear + 1) % this.list.length === this.front ){
  75. return true
  76. }else{
  77. return false
  78. }
  79. };
  80. /**
  81. * Your MyCircularQueue object will be instantiated and called as such:
  82. * var obj = new MyCircularQueue(k)
  83. * var param_1 = obj.enQueue(value)
  84. * var param_2 = obj.deQueue()
  85. * var param_3 = obj.Front()
  86. * var param_4 = obj.Rear()
  87. * var param_5 = obj.isEmpty()
  88. * var param_6 = obj.isFull()
  89. */

第二种实现方法

  1. /**
  2. * @param {number} k
  3. */
  4. var MyCircularQueue = function(k) {
  5. this.list = new Array(k+1) // 判断的时候需要将尾指针加1
  6. this.front = 0
  7. this.rear = 0
  8. this.size = k
  9. };
  10. /**
  11. * @param {number} value
  12. * @return {boolean}
  13. */
  14. MyCircularQueue.prototype.enQueue = function(value) {
  15. if(this.isFull()){
  16. return false
  17. }else{
  18. console.log('rear',this.rear)
  19. this.list[this.rear] = value
  20. // this.rear = (this.rear + 1) % this.list.length
  21. return true
  22. }
  23. };
  24. /**
  25. * @return {boolean}
  26. */
  27. MyCircularQueue.prototype.deQueue = function() {
  28. if(this.isEmpty()){
  29. return false
  30. }else{
  31. this.front = (this.front + 1) % this.list.length
  32. return true
  33. }
  34. };
  35. /**
  36. * @return {number}
  37. */
  38. MyCircularQueue.prototype.Front = function() {
  39. if(this.isEmpty()){
  40. return -1
  41. }else{
  42. return this.list[this.front]
  43. }
  44. };
  45. /**
  46. * @return {number}
  47. */
  48. MyCircularQueue.prototype.Rear = function() {
  49. if(this.isEmpty()){
  50. return -1
  51. }else{
  52. const rear = this.rear - 1
  53. const cur = rear < 0 ? this.list.length - 1 : rear
  54. return this.list[cur]
  55. }
  56. };
  57. /**
  58. * @return {boolean}
  59. */
  60. MyCircularQueue.prototype.isEmpty = function() {
  61. return this.front === this.rear ? true : false
  62. };
  63. /**
  64. * @return {boolean}
  65. */
  66. MyCircularQueue.prototype.isFull = function() {
  67. console.log((this.rear + 1) % this.list.length)
  68. if((this.rear + 1) % this.list.length === this.front ){
  69. return true
  70. }else{
  71. return false
  72. }
  73. };
  74. /**
  75. * Your MyCircularQueue object will be instantiated and called as such:
  76. * var obj = new MyCircularQueue(k)
  77. * var param_1 = obj.enQueue(value)
  78. * var param_2 = obj.deQueue()
  79. * var param_3 = obj.Front()
  80. * var param_4 = obj.Rear()
  81. * var param_5 = obj.isEmpty()
  82. * var param_6 = obj.isFull()
  83. */