编程日志4.27

队列的顺序表表示代码

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值