原先操作
改进版本:
假溢出
解决方法:
如何实现循环队列
判断循环队列为空
判断循环队列为满
存在问题:队空和堆满的判断条件重复
解决方法:
这里选择第二种方法:
循环队列类的定义
入队操作
出队操作
读取队头元素
注意:
总结:当进行元素删除操作后,从front位置开始后一个元素,直到rear部分是当前数组中存储的有效数据(左开右闭,从左到右)
front从左边开始的元素一直到rear为剩余数组中可用的空间
front位置的元素空间无法访问,被浪费掉了
queue.hpp
#include<iostream>
using namespace std;
#include<cmath>
#define MAX 100 //队列默认最大长度
template<class Data>
class cirQueue
{
private:
Data* val;//指向在堆区开辟的用户自定义类型的数组
int front;
int rear;
int mysize;//用户自己决定队列大小
public:
cirQueue() {
mysize = MAX;
front = -1;
rear = -1;
val = new Data[MAX];
}
cirQueue(int size) {
mysize = size;
front = -1;
rear = -1;
val = new Data[mysize];
}
~cirQueue() {
delete[] val;
val = NULL;
}
//值传递,将传入的元素拷贝到数组中
bool enQueue(Data item);
//bool是判断插入删除是否成功
bool deQueue();
Data getTop();
bool isEmpty();
bool isFull();
void clear();
//因为这里定义的是类模板,输出什么,应该由用户决定
//void display();
int length();
};
template<class Data>
bool cirQueue<Data>::enQueue(Data item)
{
//先判断队列是否满了
if (isFull())
{
return false;
}
//rear指向当前数组中最后一个元素,我们插入元素时,需要先更新rear下标,即把rear的位置移动到下一个位置,再在下一个位置插入新元素
rear = (rear + 1) % mysize;
val[rear] = item;
return true;
}
template<class Data>
bool cirQueue<Data>::deQueue()
{
//先判断队列是否为空
if (isEmpty())
{
return false;
}
//每一次都是删除都相当于对队列的第一个元素进行删除,即front后面的第一个元素
//更新front的坐标到删除后的当前数组中第一个元素的前面一个位置,即fornt处于原先队列被删除的第一个元素的位置
front = (front + 1) % mysize;
return true;
}
template<class Data>
Data cirQueue<Data>::getTop()
{
int i = (front + 1) % mysize;
Data temp = val[i];
return temp;
}
template<class Data>
bool cirQueue<Data>::isEmpty()
{
if (front == rear)
return true;
return false;
}
template<class Data>
bool cirQueue<Data>::isFull()
{
if ((rear + 1) % mysize == front)
return true;
return false;
}
template<class Data>
void cirQueue<Data>::clear()
{
//清空队列,相当于给队列置空
front = -1;
rear = -1;
}
template<class Data>
int cirQueue<Data>::length()
{
//求长度:绝对值
int len=abs(rear - front);
return len;
}
main.cpp
#include<iostream>
using namespace std;
#include"queue.hpp"
//测试-------------------------
struct person {
int age;
};
void test()
{
person p1 = { 10 };
person p2 = { 20 };
person p3 = { 30 };
person p4 = { 40 };
cirQueue<person> q(6);
q.enQueue(p1);
q.enQueue(p2);
q.enQueue(p3);
q.enQueue(p4);
cout << "当前队列中元素个数:" << q.length() << endl;
while (!q.isEmpty())
{
person p = q.getTop();
cout << "年龄:" << p.age << endl;
q.deQueue();
}
q.clear();
cout << "当前队列中元素个数:" << q.length() << endl;
}
int main()
{
test();
system("pause");
return 0;
}