队列的定义:只允许在一端进行插入操作,另一端进行删除操作的线性表。(先进先出)
循环队列:首尾相接的队列。
循环队列的顺序存储结构使用数组实现。引入两个指针:front指针指向对头元素,rear指针指向队尾元素的下一个位置。在循环队列里,rear指针是可以在front指针前面的。
循环队列满的条件:(rear+1)%MAXSIZE==front;//MAXSIZE为数组的最大长度
循环队列空的条件:rear==front;
计算循环队列长度:L=(rear-front+MAXSIZE)%MAXSIZE。
C++实现代码如下:
#include <iostream>
#define MAXSIZE 20
using namespace std;
template<typename T>
class queue
{
public:
queue();
~queue();
int QueueLength();//队列长度
bool EnQueue(const T &e);//在队尾插入e
bool deleteQueue(T e);//删除队头元素,并将其赋给e
private:
T data[MAXSIZE];
int front;
int rear;
};
template<typename T>
queue<T>::queue()
{
front = 0;
rear = 0;
}
template<typename T>
queue<T>::~queue()
{
}
template<typename T>
int queue<T>::QueueLength()
{
return ((rear - front + MAXSIZE) % MAXSIZE);
}
template<typename T>
bool queue<T>::EnQueue(const T &e)
{
if ((rear + 1) % MAXSIZE == front)//判断队列是否满了
{
return false;
}
data[rear] = e;
rear = (rear + 1) % MAXSIZE;//rear后移,如果到最后则转到数组开头
return true;
}
template<typename T>
bool queue<T>::deleteQueue(T e)
{
if (front == rear)
{
return false;
}
e = data[front];
front = (front + 1) % MAXSIZE;
return true;
}
void main()
{
queue<int> q1;
int e=0;
q1.EnQueue(1);
q1.EnQueue(2);
q1.QueueLength();
q1.deleteQueue(e);
system("pause");
}