C++队列
一、基本概念:
- 队列是一种线性储存数据结构,数据元素遵循“先进先出”(First in First out (FIFO))的原则
- 添加元素在队尾(只允许添加元素)实现,删除元素在对头(只允许删除元素)实现
二、队列的操作:
- 判断队列是否为空
- 入队,通常命名为push()
- 出队,通常命名为pop()
- 获取队头元素,通常命名为front()
- 求队列中元素个数
三、 队列的分类;
- 基于数组的循环队列(循环队列)
- 基于链表的队列(链表队列)
四、基于数组的循环队列
数组存储的缺点:
入队操作:在数组的末尾添加元素,时间复杂度为O(1)
出队操作:数组头部元素出队之后,头部之后的元素均需要往前移动一个位置,时间复杂度为O(n)
循环队列
为了降低时间复杂度,将数组当作一个首尾相连的圆环,分别用两个标志front、rear代表队列的头部和尾部。删除元素时,队首标志往后移,添加元素时,若队尾没有空间,考虑数组的头部空间若还有,则在队头添加元素,防止数组内存空间的流失。
判断满或空的方法:
方法一:
设置一个标志变量flag,同时满足front=rear且flag=1时为满队列
方法二:
空一个元素,保持为空
1.空队列:队首标志与队尾重合
2.满队列:队尾标志+1=队首标志
C++实现:
#include<iostream>
using namespace std;
//队列的抽象类
template <class T>
class queue
{
public:
virtual ~queue() {
};
virtual bool empty() const=0;
virtual int size() const=0;
virtual T& front() = 0;
virtual void pop() = 0;
virtual void push(const T& theElement) = 0;
};
//队列的数组类实现
template<class T>
class arrayQueue :public queue<T>
{
arrayQueue(int initialCapacity = 10);
~arrayQueue() {
delete[]queue; }
bool empty()const
{
if (queuefront == queuerear)
return true;
return false;
}
int size() const
{
return (queuerear - queuefront + capacity) % capacity;