C++数据结构(4)队列模板
·
顺序表实现:
#include<iostream>
#include<stdexcept>
using namespace std;
template<typename T>
class Queue {
private:
T* data;
int front;//指向队首
int rear;//指向对尾元素的后一个位置,也就是当前的大小
int capacity;//容量
void resize();//扩容
public:
Queue():data(new T[capacity]),front(0),rear(0),capacity(10){}
~Queue();
void enqueue(T element);//入队(从后入队)
T dequeue();//出队(从前出队)
T getFront()const;
int getSize()const;
};
template<typename T>
void Queue<T>::resize() {
T *newData = new T[capacity * 2];
for (int i = 0; i < rear; i++) {
newData[i] = data[i];
}
delete[] data;
data = newData;
capacity *= 2;
}
template<typename T>
Queue<T>::~Queue() {
delete[] data;//直接删除数据即可
}
template<typename T>
void Queue<T>::enqueue(T element) {
if (rear == capacity) {
resize();//rear代表队尾元素的下一个位置的索引,也就是当前的大小
}
data[rear++] = element;//赋值给队尾
}
template<typename T>
T Queue<T>::dequeue() {
if (front == rear) {
throw std::underflow_error("Queue is empty");//如果为空则无法出队,抛出异常
}
return data[front++];//让表头指针向前一位
}
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);
q.enqueue(4);
cout << q.getFront() << endl;
q.enqueue(5);
cout << q.getFront() << endl;
q.dequeue();
cout << q.getFront() << endl;
cout << q.getSize();
return 0;
}
链表实现:
#include<iostream>
#include<stdexcept>
using namespace std;
template<typename T>
class Queue {
private:
struct Node {
T data;//数据
Node* next;//下一位置
Node(T d) :data(d), next(NULL) {}
};
Node* front;//首
Node* rear;//尾
int size;//大小
public:
Queue() :front(NULL), rear(NULL), size(0) {};
~Queue();
void enqueue(T val);//入队
T dequeue();//出队
int getsize() const;//获取大小
T getfront() const;//获取队列头
};
template<typename T>
Queue<T>::~Queue() {
while (front) {//遍历每个节点并删除
Node* temp = front;
front = front->next;
delete temp;
}
}
template<typename T>
void Queue<T>::enqueue(T val) {
if (rear == NULL) {//如果为空
rear = new Node(val);//则创建尾节点
front = rear;//并给首节点赋值
}
else
{
rear->next = new Node(val);//尾节点指向新节点
rear = rear->next;//更新尾节点
}
size++;//增大
}
template<typename T>
T Queue<T>::dequeue() {
if (front == NULL) {
throw std::underflow_error("queue is empty");
}
T element = front->data;
Node* temp = front;
front = front->next;
delete temp;
size--;
if (size == 0) {
//当出列完队列后,此时rear指向的部分已被删除,所以要定义一下rear=NULL,让他执行我们入队时创建新节点的逻辑
rear = NULL;
}
return element;
}
template<typename T>
int Queue<T>::getsize() const{
return size;
}
template<typename T>
T Queue<T>::getfront()const {
if (front == NULL) {
throw std::underflow_error("Queue is empty");
}
return front->data;
}
int main() {
Queue<int>q;
q.enqueue(3);
q.enqueue(4);
cout << q.getfront() << endl;
q.enqueue(5);
cout << q.getfront() << endl;
q.dequeue();
q.dequeue();
q.dequeue();
q.enqueue(3);
cout << q.getfront() << endl;
cout << q.getsize();
return 0;
}
更多推荐



所有评论(0)