队列的顺序表表示代码
#include<iostream>
#include<stdexcept>
using namespace std;
//队列 类的声明
template<typename T>//1.模板声明,表明Queue类是一个通用的模板类,可以用于存储任何类型的元素T
class Queue {//2.Queue类的声明,表示一个队列的数据结构
private://定义成员变量私有
T* data;//3.用于存储队列中的元素,它是一个指向类型为T的指针
int front;//4.用于记录队首的索引
int rear;//5.用于记录队尾的索引
int capacity;//6.用于记录队列的容量
void resize();//7.用于在队列容量不足时进行扩容
public://定义公共成员函数
//8.Queue()是构造函数,用于初始化队列的成员变量。它创建一个新的队列,并分配一个容量为10的数组来存储元素,front和rear一开始都指向0,代表一个空队列
Queue():data(new T[10]),front(0),rear(0),capacity(10){}
~Queue();//9.析构函数,用于释放队列所占用的内存
void enqueue(T element);//10.用于将一个新元素入队
T dequeue();//11.用于出队
T getFront() const;//12.用于获取队首的元素,但不弹出它
int getSize() const;//13.用于获取队列中元素的数量
};
//队列的扩容
template<typename T>//1.模板声明,表明resize函数是一个通用的模板类,可以用于处理任何类型的元素T
//resize用于在队列容量不足时进行扩容操作。它创建了一个更大的数组,并将旧数组的元素复制到新数组中,然后更新队列元素的指针和容量,确保不溢出。
void Queue<T>::resize() {
T* newData = new T[capacity * 2];//计算新容量为当前容量的两倍,并创建新数组newData,用于存储扩充后的元素,新数组大小为新的容量
for (int i = 0; i < rear; i++) {
newData[i] = data[i];//复制元素到新数组
}
delete[] data;//释放旧数组占用的空间
data = newData;//newData数组赋给data,使其成为队列的新存储数组
capacity *= 2;//更新队列容量
}
//队列的销毁
template<typename T>
Queue<T>::~Queue() {//析构函数的声明,用于在对象销毁时执行清理操作
delete[] data;//释放了动态分配的数组data所占用的内存空间。delete[]用于释放动态分配的数组内存
}
//入队
template<typename T>
void Queue<T>::enqueue(T element) {
if (rear == capacity) {//队尾等于容量,调用resize()扩容
resize();
}
data[rear++] = element;//element赋值给队列数组data的rear位置,并将rear的值增加1,以表示队列中元素的数量增加
}
//出队
template<typename T>
T Queue<T>::dequeue() {
if (front == rear) {//栈空 抛出异常
throw std::underflow_error("Queue is empty");
}
return data[front++];//不空,返回队首索引元素,并将front+1,代表移除队首元素。
}
//获取队首元素
template<typename T>
T Queue<T>::getFront() const {
if (front == rear) {
throw std::underflow_error("Queue is empty");
}
return data[front];//队不空,返回队首元素
}
//获取队列长度
template<typename T>
int Queue<T>::getSize() const {
return rear - front;//队尾减去队头得队列长度
}
//主函数
int main() {
Queue<int> q;
q.enqueue(3);//入队3
q.enqueue(4);
cout << q.getFront() << endl;//队首元素为3
q.enqueue(5);
cout << q.getFront() << endl;//3
q.dequeue();//移除队首元素3
cout << q.getFront() << endl;//4
cout << q.getSize() << endl;//2 (4,5)
return 0;
}