探索队列和栈 设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。

可以看动画演示

https://leetcode-cn.com/explore/learn/card/queue-stack/216/queue-first-in-first-out-data-structure/864/

代码如下:

class MyCircularQueue {
private:
    vector<int> data;//用来存储数据
     int head;
     int tail;
     int size;
public:
    /** Initialize your data structure here. Set the size of the queue to be k. */
    MyCircularQueue(int k) 
    {
       data.resize(k);
        head=-1;//从-1开始
        tail=-1;
        size=k;//容器大小
    }
    
    /** Insert an element into the circular queue. Return true if the operation is successful. */
    bool enQueue(int value) 
    {
        if(isFull())//容器已经满了
        {
            return false;
        }
        if(head==-1)//head还在-1位置
        {
            head=0;
        }
        tail=(tail+1)%size;
        data[tail]=value;
        return true;
    }
    
    /** Delete an element from the circular queue. Return true if the operation is successful. */
    bool deQueue() 
    {
       if(isEmpty())//队列为空
       {
           return false;
       }
        if(head==tail)//两个指针已经指向同一个位置
        {
            head=-1;
            tail=-1;
            return true;
        }
        head=(head+1)%size;
        return true;
    }
    
    /** Get the front item from the queue. */
    int Front()
    {
        if(isEmpty())
        {
            return -1;
        }
        return data[head];
    }
    
    /** Get the last item from the queue. */
    int Rear() 
    {
       if(isEmpty())
       {
           return -1;
       }
        return data[tail];
    }
    
    /** Checks whether the circular queue is empty or not. */
    bool isEmpty()
    {
        return head==-1;//只有head处于-1时是空队列

    }
    
    /** Checks whether the circular queue is full or not. */
    bool isFull() {
          return ((tail+1)%size)==head;//满状态
    }
};
发布了70 篇原创文章 · 获赞 39 · 访问量 2262

猜你喜欢

转载自blog.csdn.net/weixin_45221477/article/details/105033182