leetCode 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
 

 

提示:

  • 所有的值都在 1 至 1000 的范围内;
  • 操作数将在 1 至 1000 的范围内;
  • 请不要使用内置的队列库。

 

 

 

class MyCircularQueue {
public:
    /** Initialize your data structure here. Set the size of the queue to be k. */
    MyCircularQueue(int k) {

        x = new int[k + 1];
        trail = front = 0;
        size = k + 1;
    }

    /** Insert an element into the circular queue. Return true if the operation is successful. */
    bool enQueue(int value) {
        if (isFull())return 0;
        x[trail] = value;
        trail = (trail + 1) % size;
        return 1;
    }

    /** Delete an element from the circular queue. Return true if the operation is successful. */
    bool deQueue() {
        if (isEmpty())return 0;
        front = (front + 1) % size;
        return 1;
    }

    /** Get the front item from the queue. */
    int Front() {
        if (isEmpty())return -1;
        return x[front];
    }

    /** Get the last item from the queue. */
    int Rear() {
        if (isEmpty())return -1;
        
        return trail == 0 ? x[size - 1] : x[(trail - 1) % (size - 1)];
    
    }

    /** Checks whether the circular queue is empty or not. */
    bool isEmpty() {
        if (front == trail)return true;
        return false;
    }

    /** Checks whether the circular queue is full or not. */
    bool isFull() {

        if ((trail + 1) % size == front)return true;
        return false;
    }
public:
    int *x;
    int front;
    int trail;
    int size;
};

LeetCode题目622的设计是一个“循环队列”(Circular Queue)问题。循环队列是一种特殊的线性数据结构,它类似于普通队列,但是它的两端是相连的,形成了一个环。这意味着元素可以在队列的一端入队,在另一端出队,而不会导致数据丢失。 在标准队列中,当队列满时,如果继续添加新元素,就会导致旧元素被覆盖。但在循环队列中,当你试图从队列尾部移除元素时,如果队列为空,实际上你会从头部开始移除,形成一个循环。 设计这样的数据结构通常会包含以下几个关键功能: 1. 初始化:创建一个新的空循环队列。 2. 入队(enqueue):将一个元素添加到队列尾部,并保持队列的循环特性。 3. 出队(dequeue):如果队列非空,删除并返回队头的元素;如果队列已满且无法再入队,处理特殊情况,如返回特殊或抛出异常。 4. 查看队头元素(front):获取队头元素,但不删除。 5. 查看队尾元素(rear):获取队尾元素,同样不删除。 6. 判断队列是否为空(isEmpty):检查队列是否有元素。 7. 判断队列是否已满(isFull):检查队列是否达到其最大容量。 在实现时,可以考虑使用数组或者链表作为底层数据结构,同时维护两个指针,一个指向当前队头,一个指向下一个应该插入的位置,以便于操作。需要注意的是,由于循环特性,需要对这两个指针进行特别的处理,比如在判断队尾元素时需要考虑到队列大小限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值