• [LeetCode] 622. Design Circular Queue


    Design your implementation of the circular queue. The circular queue is a linear data structure in which the operations are performed based on FIFO (First In First Out) principle and the last position is connected back to the first position to make a circle. It is also called "Ring Buffer".

    One of the benefits of the circular queue is that we can make use of the spaces in front of the queue. In a normal queue, once the queue becomes full, we cannot insert the next element even if there is a space in front of the queue. But using the circular queue, we can use the space to store new values.

    Your implementation should support following operations:

    • MyCircularQueue(k): Constructor, set the size of the queue to be k.
    • Front: Get the front item from the queue. If the queue is empty, return -1.
    • Rear: Get the last item from the queue. If the queue is empty, return -1.
    • enQueue(value): Insert an element into the circular queue. Return true if the operation is successful.
    • deQueue(): Delete an element from the circular queue. Return true if the operation is successful.
    • isEmpty(): Checks whether the circular queue is empty or not.
    • isFull(): Checks whether the circular queue is full or not.

    Example:

    MyCircularQueue circularQueue = new MyCircularQueue(3); // set the size to be 3
    circularQueue.enQueue(1);  // return true
    circularQueue.enQueue(2);  // return true
    circularQueue.enQueue(3);  // return true
    circularQueue.enQueue(4);  // return false, the queue is full
    circularQueue.Rear();  // return 3
    circularQueue.isFull();  // return true
    circularQueue.deQueue();  // return true
    circularQueue.enQueue(4);  // return true
    circularQueue.Rear();  // return 4

    Note:

    • All values will be in the range of [0, 1000].
    • The number of operations will be in the range of [1, 1000].
    • Please do not use the built-in Queue library.

    设计循环队列。

    设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

    循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

    你的实现应该支持如下操作:

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

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

    思路还是比较直观的,既然是环形队列,说明一定是只能使用固定大小的内存。为了达到这个题的练习目的,这道题我用数组实现。创建一个长度为 K 的数组,同时创建几个变量,front, rear是数组前后的两个指针,代表enque和deque的位置,len 记录数组目前的长度。

    时间O(n)

    空间O(n)

    Java实现

     1 class MyCircularQueue {
     2     final int[] a;
     3     int front = 0;
     4     int rear = -1;
     5     int len = 0;
     6 
     7     public MyCircularQueue(int k) {
     8         a = new int[k];
     9     }
    10 
    11     public boolean enQueue(int val) {
    12         if (!isFull()) {
    13             rear = (rear + 1) % a.length;
    14             a[rear] = val;
    15             len++;
    16             return true;
    17         } else
    18             return false;
    19     }
    20 
    21     public boolean deQueue() {
    22         if (!isEmpty()) {
    23             front = (front + 1) % a.length;
    24             len--;
    25             return true;
    26         } else
    27             return false;
    28     }
    29 
    30     public int Front() {
    31         return isEmpty() ? -1 : a[front];
    32     }
    33 
    34     public int Rear() {
    35         return isEmpty() ? -1 : a[rear];
    36     }
    37 
    38     public boolean isEmpty() {
    39         return len == 0;
    40     }
    41 
    42     public boolean isFull() {
    43         return len == a.length;
    44     }
    45 }

    LeetCode 题目总结

  • 相关阅读:
    Conversion to Dalvik format failed with error 1 解决方法
    android 简单的反编译
    android ant打包问题总结
    android Sdcard 不同系统映射
    android 好用的开源框架
    android ScrollView 与 ListView 冲突汇总
    android 关于ImageView无法显示过长图片
    android 微信分享api调用总结
    android 捕获线程出错 重启线程
    c++中的容器和string类
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13425627.html
Copyright © 2020-2023  润新知