队列-实现
队列的实现方式其实很好理解,就是一个数组,我们通过指针对头部进行索引,就可以实现了。
这种方法实现很简单,但是效率很低,因为数组的大小不是固定的,会随着指针的移动,占用的空间越来越大。
改进队列
循环队列:我们使用固定大小的数组,和两个指针来指示起始位置和结束位置,目的是重用我们之前被浪费掉的存储。
设计循环队列
要求我们设计的队列有如下功能:
- 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