• 入门力扣自学笔记111 C++ (题目编号622)


    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/problems/design-circular-queue
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    思路:

    使用动态数组以便在运行阶段创建需要大小的数组
    循环队列的实现关键在于isFull()和isEmpty()的实现
    设当front = rear = -1时队列为空
    当(rear + 1) % capacity = front时队列为满
    入队时先后判断满或空否,若为首个元素,则front = rear = 0;否则rear = (rear + 1) % capacity
    出队时判断空否,空则front = rear = -1,否则front = (front + 1) % capacity


    代码:

    1. class MyCircularQueue {
    2. private:
    3. int *data;
    4. int front, rear;
    5. int len;
    6. public:
    7. MyCircularQueue(int k) {
    8. data = new int[k];
    9. front = rear = -1;
    10. len = k;
    11. }
    12. ~MyCircularQueue() {
    13. delete[] data;
    14. }
    15. bool enQueue(int value) {
    16. if (isFull())
    17. return false;
    18. if (isEmpty())
    19. front++;
    20. rear = (rear + 1) % len;//rear后移一位,若到最后则转到数组头部
    21. data[rear] = value;
    22. return true;
    23. }
    24. bool deQueue() {
    25. if (isEmpty())
    26. return false;
    27. if (front == rear && front != -1)//只剩一位
    28. front = rear = -1;
    29. else
    30. front = (front + 1) % len;
    31. return true;
    32. }
    33. int Front() {
    34. if (isEmpty())
    35. return -1;
    36. return data[front];
    37. }
    38. int Rear() {
    39. if (isEmpty())
    40. return -1;
    41. return data[rear];
    42. }
    43. bool isEmpty() {
    44. return (front == rear && front == -1);
    45. }
    46. bool isFull() {
    47. return ((rear + 1) % len == front);
    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. */

  • 相关阅读:
    ES6——ES6相关面试题分享
    如何去除数据库中重复的数据
    css怎么实现文字描边
    04-Redis源码数据结构之字典
    Redis持久化RDB/AOF
    今天起,Windows可以一键召唤GPT-4了
    今天给大家介绍一篇基于javaWeb的汽车订票系统的设计与实现
    网络安全人才发展史
    面向个性化需求的在线云数据库混合调优系统 | SIGMOD 2022入选论文解读
    ROS学习|Nodetlet学习与使用
  • 原文地址:https://blog.csdn.net/DK_Sorhic/article/details/126116689