队列是什么
队列也是一种特殊的表(list)。表通常分为三种:
1.链表(linked list):随机插入,随机删除;
2.栈(stack):先进后出(FILO);
3.队列(queue):先进先出(FIFO)。
可以把队列想象成排队的队伍。显然,最先排队的人最先得到服务,然后离开队伍;队尾不断有其他人加入。队列正是模拟了现实世界的这一普遍情景。
队列的作用
队列在网络、消息传递、图论中的应用比较广泛。举个例子,图的广度优先搜索就是用队列来实现的。
队列的实现
本文采用数组的方式实现了一个循环队列。队列模板类包含了一个数组、两个下标(front和rear)和队列大小等成员变量,同时也实现了绝大多数队列操作。
队列模板类的定义:
template <class T>
class Queue
{
public:
Queue();
~Queue();
bool isEmpty();
bool isFull();
int size();
void create(int capacity);
void clear();
void destroy();
void enqueue(T val);
void dequeue();
T front();
private:
int succ(int pos);
int _front;//队首索引
int _rear;//队尾索引
int _size;//队列大小
int _capacity;//队列容量
T *_array;//保存队列数据的数组
};
下面是具体的队列操作实现:
1.判断队列是否为空
template <class T>
bool Queue<T>::isEmpty()
{
return _size == 0;
}
2.判断队列是否已满
template <class T>
bool Queue<T>::isFull()
{
return _size == _capacity;
}
3.获取队列大小
template <class T>
int Queue<T>::size()
{
return _size;
}
4.创建队列
template <class T>
void Queue<T>::create(int maxSize)
{
_array = new T[maxSize];
_capacity = maxSize;
}
5.清空队列
template <class T>
void Queue<T>::clear()
{
_front = 1;
_rear = 0;
_size = 0;
}
6.删除队列
template <class T>
void Queue<T>::destroy()
{
_front = 1;
_rear = 0;
_size = 0;
_capacity = 0;
delete [] _array;
}
7.入队
template <class T>
void Queue<T>::enqueue(T val)
{
if (!isFull())
{
_rear = succ(_rear);
_array[_rear] = val;
_size++;
}
}
8.出队
template <class T>
void Queue<T>::dequeue()
{
if (!isEmpty())
{
_front = succ(_front);
_size--;
}
}
9.获取队首
template <class T>
T Queue<T>::front()
{
if (!isEmpty())
{
return _array[_front];
}
return NULL;
}
10.计算后继索引
//由于实现的是循环队列,所以当索引值超过队列容量时索引会自动变成0,回到队列的起点
template <class T>
int Queue<T>::succ(int pos)
{
return (pos + 1) % _capacity;
}
结果展示
测试代码:
#include "queue.h"
using namespace std;
int main()
{
Queue<int> queue;
queue.create(10);
for (int i=0; i<8; i++)
{
queue.enqueue(i);
}
for (int i=0; i<8; i++)
{
queue.dequeue();
}
for (int i=0; i<8; i++)
{
queue.enqueue(i);
}
cout << "Queue size:" << queue.size() << endl;
cout << "Queue front:";
for (int i=0; i<5; i++)
{
int val = queue.front();
cout << val << " ";
queue.dequeue();
}
cout << endl << "Queue size:" << queue.size() << endl;
return 0;
}
结果: