LeetCode 622.设计循环队列(详细注释) - C++

队列-实现

队列的实现方式其实很好理解,就是一个数组,我们通过指针对头部进行索引,就可以实现了。

这种方法实现很简单,但是效率很低,因为数组的大小不是固定的,会随着指针的移动,占用的空间越来越大。

改进队列

循环队列:我们使用固定大小的数组,和两个指针来指示起始位置和结束位置,目的是重用我们之前被浪费掉的存储。

设计循环队列

要求我们设计的队列有如下功能:

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

设计代码如下(C++):

class MyCircularQueue {
private:
  int *data;   // 存放队列数据
  int head;    // 队列头部
  int tail;    // 队列尾部
  int len;     // 队列长度
  int count;   // 队列内部元素个数
public:
  /** 在此初始化数据结构,将队列长度设置为k **/
  MyCircularQueue(int k) {
    data = new int[k];
    head = 0;
    tail = 0;
    len = k;
    count = 0;
  }
  /** 将元素插入循环队列中,如果成功则返回true **/
  bool enQueue(int value) {
    if(isFull()){		// 循环队列满
      return false;
    } else {			//插入元素到队列尾部
      data[tail] = value;
      count++;
      tail = (tail+1) %len;
      return true;
    }
  }
  /** 从循环队列中删除元素,如果成功则返回true **/
  bool deQueue() {
    if(isEmpty()){		// 循环队列空
      return false;
    } else {
      head = (head + 1) % len;
      count--;
      return true;
    }
  }
  /** 获取队列头部元素 **/
  int Front() {
    if(isEmpty()){		// 循环队列空
      return -1;
    } else {
      return data[head];
    }
  }
  /** 获取队列尾部元素 **/
  int Rear() {
    if(isEmpty()){  	// 循环队列空
      return -1;
    } else {
      int temp = tail == 0 ? (len-1) : (tail-1);
      return data[temp];
    }
  }
  /** 检查队列是否为空 **/
  bool isEmpty() {
    return count == 0;  	//队列元素个数为0,元素空。
  }
  /** 检查队列是否已满 **/
  bool isFull() {
    return count == len;  	// 队列元素个数等于数组最大长度,队列满
  }
};

放在最后

如果您喜欢我的文章,拜托点赞收藏关注,博主会根据大家喜好来推出相关系列文章~

更多精彩内容也可以访问我的博客Aelous-BLog

你可能感兴趣的:(LeetCode,leetcode)