【LeetCode】622. 设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:

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

解题思路比较简单,用头尾两个指针分别表示当前队列的头部和尾部,用一个变量对当前元素的数量进行计数,循环时需要注意的是当指针指向最后一个元素时,需要判断接下来的操作是否需要把指针返回初始头部。

class Solution {
private:
        int Size;
        unsigned int *Queue;
        unsigned int *Head;
        unsigned int *Tail;
        unsigned int *preTail;
        int InQueueNum;
public:
        void MyCircularQueue(int k); /** Initialize your data structure here. Set the size of the queue to be k. */
        void ShowQueue(int qsize);/*show current queue*/
        bool enQueue(int value); /** Insert an element into the circular queue. Return true if the operation is successful. */
        bool deQueue(void);    /** Delete an element from the circular queue. Return true if the operation is successful. */
        int Front(void); /** Get the front item from the queue. */
        int Rear(void);  /** Get the last item from the queue. */
        bool isEmpty(void); /** Checks whether the circular queue is empty or not. */
        bool isFull(void); /** Checks whether the circular queue is full or not. */
};


void Solution::MyCircularQueue(int k)
{
    Size = k;
    Queue = new unsigned int[k];
    Head = Tail = Queue;
    InQueueNum = 0;
}

bool Solution::deQueue(void)
{
        if(0 == InQueueNum)
        {
            cout<<"Queue Empty"<<endl;
            return false;
        }
        else
        {
            *Head = 0;
            if(Head == Queue + Size - 1)
            {
                Head = Queue;
            }
            else
            {
                Head++;
            }
            InQueueNum -- ;
            return true;
        }
}

void Solution::ShowQueue(int qsize)
{
    unsigned int index = 0;
    unsigned int *pqueue = Queue;
    for(index = 0; index < qsize; index++)
    {
        if(index == qsize - 1)
        {
            cout<<*pqueue<<endl;
        }
        else
        {
            cout<<*pqueue<<"->";
        }
        pqueue ++;
    }
}


bool Solution::enQueue(int value)
{
    if(InQueueNum < Size)
    {
        *Tail = value;
        preTail = Tail;
        if(Tail == Queue + Size - 1)
        {
            Tail = Queue;
        }
        else
        {
            Tail++;
        }
        InQueueNum ++;
        cout<<"In Queue Success"<<endl;
        return true;
    }
    else
    {
        cout<<"Queue Full"<<endl;
        return false;
    }
}

int Solution::Front(void)
{
    if(0 == InQueueNum)
    {
        cout<<"Queue Empty"<<endl;
        return -1;
    }
    else
    {
        return *Head;
    }
}


int Solution::Rear(void)
{
    if(0 == InQueueNum)
    {
        cout<<"Queue Empty"<<endl;
        return -1;
    }
    else
    {
        return *preTail;
    }
}

bool Solution::isEmpty(void)
{
    if(0 == InQueueNum)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool Solution::isFull(void)
{
    if(InQueueNum == Size)
    {
        return true;
    }
    else
    {
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/syc233588377/article/details/85998907