当前位置:   article > 正文

循环队列_循环顺序队列中是否可以插入下一个元素

循环顺序队列中是否可以插入下一个元素

622. 设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 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 的范围内;
请不要使用内置的队列库。


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-circular-queue
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:在删除元素时,会出现 l 超过 r 的现象,这个要注意一下

            (头)                       (尾)

                 ^                                 ^

                 l                                  r

            队列为空的情况:l = r && vect[l] = -1        (vect[] 初始都是 -1)

            队列为满的情况:队列不空 && (r+1) % len == l  

            插入队列元素时注意:插入第一个元素时,r是不用移动的

            删除队列元素时注意:l 移动时要注意不能越过 r

  1. class MyCircularQueue {
  2. public:
  3. vector<int>vect;
  4. int l,r,len;
  5. /** Initialize your data structure here. Set the size of the queue to be k. */
  6. MyCircularQueue(int k) {
  7. for(int i=0;i<k;i++) vect.push_back(-1);
  8. l = r = 0;
  9. len = k;
  10. }
  11. /** Insert an element into the circular queue. Return true if the operation is successful. */
  12. bool enQueue(int value) {
  13. if(isFull()) return false;
  14. if(isEmpty()){ // 注意1
  15. vect[r] = value;
  16. return true;
  17. }
  18. r = (r+1) % len;
  19. vect[r] = value;
  20. return true;
  21. }
  22. /** Delete an element from the circular queue. Return true if the operation is successful. */
  23. bool deQueue() {
  24. if(isEmpty()) return false;
  25. vect[l] = -1;
  26. if(l != r) l = (l+1) % len; // 注意2
  27. return true;
  28. }
  29. /** Get the front item from the queue. */
  30. int Front() {
  31. if(isEmpty()) return -1;
  32. return vect[l];
  33. }
  34. /** Get the last item from the queue. */
  35. int Rear() {
  36. if(isEmpty()) return -1;
  37. return vect[r];
  38. }
  39. /** Checks whether the circular queue is empty or not. */
  40. bool isEmpty() {
  41. if(l == r && vect[l] == -1) return true;
  42. return false;
  43. }
  44. /** Checks whether the circular queue is full or not. */
  45. bool isFull() {
  46. if(!isEmpty() && (r+1)%len == l) return true;
  47. return false;
  48. }
  49. };
  50. /**
  51. * Your MyCircularQueue object will be instantiated and called as such:
  52. * MyCircularQueue* obj = new MyCircularQueue(k);
  53. * bool param_1 = obj->enQueue(value);
  54. * bool param_2 = obj->deQueue();
  55. * int param_3 = obj->Front();
  56. * int param_4 = obj->Rear();
  57. * bool param_5 = obj->isEmpty();
  58. * bool param_6 = obj->isFull();
  59. */

641. 设计循环双端队列

设计实现双端队列。
你的实现需要支持以下操作:

MyCircularDeque(k):构造函数,双端队列的大小为k。
insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
isEmpty():检查双端队列是否为空。
isFull():检查双端队列是否满了。
示例:

MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3
circularDeque.insertLast(1);                    // 返回 true
circularDeque.insertLast(2);                    // 返回 true
circularDeque.insertFront(3);                    // 返回 true
circularDeque.insertFront(4);                    // 已经满了,返回 false
circularDeque.getRear();                  // 返回 2
circularDeque.isFull();                        // 返回 true
circularDeque.deleteLast();                    // 返回 true
circularDeque.insertFront(4);                    // 返回 true
circularDeque.getFront();                // 返回 4
 
 

提示:

所有值的范围为 [1, 1000]
操作次数的范围为 [1, 1000]
请不要使用内置的双端队列库。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-circular-deque
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:有了上一题的基础,这道题就很轻松的过了

  1. class MyCircularDeque {
  2. public:
  3. /** Initialize your data structure here. Set the size of the deque to be k. */
  4. MyCircularDeque(int k) {
  5. for(int i=0;i<k;i++) vect.push_back(-1);
  6. l = r = 0;
  7. len = k;
  8. }
  9. /** Adds an item at the front of Deque. Return true if the operation is successful. */
  10. bool insertFront(int value) {
  11. if(isFull()) return false;
  12. if(isEmpty()){
  13. vect[l] = value;
  14. return true;
  15. }
  16. l = (l+len-1)%len;
  17. vect[l] = value;
  18. return true;
  19. }
  20. /** Adds an item at the rear of Deque. Return true if the operation is successful. */
  21. bool insertLast(int value) {
  22. if(isFull()) return false;
  23. if(isEmpty()){
  24. vect[r] = value;
  25. return true;
  26. }
  27. r = (r+1)%len;
  28. vect[r] = value;
  29. return true;
  30. }
  31. /** Deletes an item from the front of Deque. Return true if the operation is successful. */
  32. bool deleteFront() {
  33. if(isEmpty()) return false;
  34. if(l == r){
  35. vect[l] = -1;
  36. return true;
  37. }
  38. vect[l] = -1;
  39. l = (l+1)%len;
  40. return true;
  41. }
  42. /** Deletes an item from the rear of Deque. Return true if the operation is successful. */
  43. bool deleteLast() {
  44. if(isEmpty()) return false;
  45. if(l == r){
  46. vect[r] = -1;
  47. return true;
  48. }
  49. vect[r] = -1;
  50. r = (r+len-1)%len;
  51. return true;
  52. }
  53. /** Get the front item from the deque. */
  54. int getFront() {
  55. if(isEmpty()) return -1;
  56. return vect[l];
  57. }
  58. /** Get the last item from the deque. */
  59. int getRear() {
  60. if(isEmpty()) return -1;
  61. return vect[r];
  62. }
  63. /** Checks whether the circular deque is empty or not. */
  64. bool isEmpty() {
  65. if(l == r && vect[l] == -1) return true;
  66. return false;
  67. }
  68. /** Checks whether the circular deque is full or not. */
  69. bool isFull() {
  70. if(!isEmpty() && (r+1)%len == l) return true;
  71. return false;
  72. }
  73. private:
  74. vector<int>vect;
  75. int l,r,len;
  76. };
  77. /**
  78. * Your MyCircularDeque object will be instantiated and called as such:
  79. * MyCircularDeque* obj = new MyCircularDeque(k);
  80. * bool param_1 = obj->insertFront(value);
  81. * bool para _2 = obj->insertLast(value);
  82. };
  83. /**
  84. * Your MyCircularDeque object will be instantiated and called as such:
  85. * MyCircularDeque* obj = new MyCircularDeque(k);
  86. * bool param_1 = obj->insertFront(value);
  87. * bool param_2 = obj->insertLast(value);
  88. * bool param_3 = obj->deleteFront();
  89. * bool param_4 = obj->deleteLast();
  90. * int param_5 = obj->getFront();
  91. * int param_6 = obj->getRear();
  92. * bool param_7 = obj->isEmpty();
  93. * bool param_8 = obj->isFull();
  94. */

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/515596
推荐阅读
相关标签
  

闽ICP备14008679号