1.队列的特点: 先进先出,用数组存储。
***2.队列的基本操作:***存入数据、删除数据、读队列头数据。
需要一个变量front指向队列的头下标,另一个变量rear指向队列的尾下标。
增加元素时rear向后移一个,删除一个元素时front向后移一个,但是并不
删除原有数据,这样的话就会浪费前面的空间,所以我们要假设数组前后相
连,循环的存放数据,直到数组中所有数据都有效时存满。
存入数据(append):
删除数据(serve):
读取队列头数据(retrieve):
3.程序实现
#include<iostream>
#include"utility.h"
using namespace std;
const int maxqueue = 10; //队列的长度,也就是数组的长度
class Queue {
public:
Queue(); //构造函数
bool empty() const; //判断队列是否为空,在函数操作中并不改变队列元素,所以要加const
Error_code serve(); //删除一个数据
Error_code append(const Queue_entry &item); //将item的值加进队列中,为了节省空间用引用,但使用过程中不能改变原有值,所以加const
Error_code retrieve(Queue_entry &item) const; //读出队列的头数据,在函数操作中并不改变队列元素,所以要加const
protected:
int count; //计算队列数据个数
int front, rear; //队列头下标和队列尾下标
Queue_entry entry[maxqueue]; //定义一个数组当做队列来存放数据
};
Queue::Queue() //构造函数
/*
Post: The Queue is initialized to be empty.
*/
{
count = 0; //初始队列个数为0
rear = maxqueue - 1; //存入数据时rear先向后移再放数据,所以初始时rear应该指向0号下标的前一个,队列是循环的,所以rear为总长度减一
front = 0; //初始时front指向0号下标
}
bool Queue::empty() const //判断队列是否为空
{
return count == 0;
}
Error_code Queue::append(const Queue_entry &item) //将item的值加进队列中
{
if (count >= maxqueue) return overflow; //若队列中已存满则提示溢出,未满则执行下一步
count++;
rear = ((rear + 1) == maxqueue) ? 0 : (rear + 1); //若rear现在已经指向数组的最大下标则循环,这个数据存放在0下标
entry[rear] = item; //将数据存入数组
return success;
}
Error_code Queue::serve() //删除一个数据
{
if (count <= 0) return underflow; //若队列中无元素则提示下溢出
count--;
front = ((front + 1) == maxqueue) ? 0 : (front + 1); //若目前front指向最大下标,则删除这个元素,front需向后移,循环则指向0号下标
return success;
}
Error_code Queue::retrieve(Queue_entry &item) const //读出队列的头数据
{
if (count <= 0) return underflow; //若队列中无元素则提示下溢出
item = entry[front]; //将队列头元素的值赋给item
return success;
}
4.扩展功能
class Extended_queue: public Queue
{
public:
bool full() const; //判断队列是否存满
int size() const; //查询队列中元素个数
void clear(); //清空队列数据
Error_code serve_and_retrieve(Queue_entry &item); //读出队列第一个元素并且删除
};
bool Extended_queue::full() const
{
return maxqueue == count; //判断队列数据个数是否与最大个数相等,相等则表示已满
}
int Extended_queue::size() const
{
return count;
}
void Extended_queue::clear()
{
count = 0;
rear = maxqueue - 1;
front = 0;
}
Eorror_code Extended_queue::serve_and_retrieve(Queue_entry &item)
{
retrieve(item);
serve();
}