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


    641. 设计循环双端队列

    题目:

    设计实现双端队列。

    实现 MyCircularDeque 类:

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


    示例 1:

    输入
    ["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"]
    [[3], [1], [2], [3], [4], [], [], [], [4], []]
    输出
    [null, true, true, true, false, 2, true, true, true, 4]

    解释
    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();                // 返回


    提示:

    1 <= k <= 1000
    0 <= value <= 1000
    insertFront, insertLast, deleteFront, deleteLast, getFront, getRear, isEmpty, isFull  调用次数不大于 2000 次


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


    思路:

    数组用于模拟固定容量的循环队列是非常合适的且便捷的。
    针对容量为k的双端队列,我们申请一个容量为k+1的数组。
    用整型front作为数组的下标,指向队列的前端;用整型rear作为数组的下标,指向队列的尾部+1的位置,即下一个插入的位置。
    队列为空时front == rear; 队列为满时,(rear+1)%capacity == front;之所以用k+1作为数组的容量,就是为了防止rear和front相等时即可能满也可能空;不用一个额外的变量进行判断。

    往前插入时,front--,并对capacity取模。往后插入时,rear++,并对capacity取模。这样越界的时候就重新回到了数组的另一端;这也是循环队列中循环的意思。


    代码:

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

  • 相关阅读:
    Redis实现简易消息队列的三种方式
    基于最小二乘正弦拟合算法的信号校正matlab仿真,校正幅度,频率以及时钟误差,输出SNDR,SFDR,ENOB指标
    TF卡格式化了怎么办?tf卡数据恢复,看这3个方法
    字节二面,差点没答好
    termux安装常用工具
    Node.js中的单线程服务器
    微信小程序-wxml语法
    C#添加缓存,删除缓存,修改缓存
    异步非阻塞python3代码
    云原生之旅 - 5)Kubernetes时代的包管理工具 Helm
  • 原文地址:https://blog.csdn.net/DK_Sorhic/article/details/126340406