顺序表实现:

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

更多推荐