【队列】循环队列

本文介绍了一个通用的循环队列类模板实现,支持多种基本操作如入队、出队、获取队头队尾元素等,并提供了动态调整队列大小的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CircularQueue.h

#ifndef CIRCULARQUEUE_H
#define CIRCULARQUEUE_H

int default_size = 10;

#include<iostream>
//CircularQueue
template<typename T>
class CircularQueue{
public:
	typedef T& reference;
	CircularQueue(int size = default_size);//constructor
	~CircularQueue();//destructor
	void push(const T value);//push
	void pop();//pop
	reference get_front();//front
	reference get_back();//back
	bool empty();//whether CircularQueue is empty or not
	int size();//get length
private:
	void renew(int size);//realloc CircularQueue size
private:
	T* element;
	int front;
	int rear;
	int queue_size;
};
//constructor
template<typename T>
CircularQueue<T>::CircularQueue(int size = default_size):front(0),rear(0){
	if (size > 0){
		element = new T[size];
		queue_size = size;
	}
	else{
		element = new T[default_size];
		queue_size = default_size;
	}
}
//destructor
template<typename T>
CircularQueue<T>::~CircularQueue(){
	delete[] element;
	front = 0;
	rear = 0;
	queue_size = 0;
}
//push
template<typename T>
void CircularQueue<T>::push(const T value){
	if ((rear + 1) % queue_size == front){
		renew(queue_size+default_size);
		queue_size += default_size;
	}
	element[rear] = value;
	rear = (rear + 1) % queue_size;
}
//pop
template<typename T>
void CircularQueue<T>::pop(){
	if (empty()){
		std::cout << "there is no element in queue" << std::endl;
		exit(1);
	}
	front = (front + 1) % queue_size;
}
//front
template<typename T>
typename CircularQueue<T>::reference CircularQueue<T>::get_front(){
	if (empty()){
		std::cout << "there is no element in queue" << std::endl;
		exit(1);
	}
	return element[front];
}
//back
template<typename T>
typename CircularQueue<T>::reference CircularQueue<T>::get_back(){
	if (empty()){
		std::cout << "there is no element in queue" << std::endl;
		exit(1);
	}
	return element[(rear - 1 + queue_size) % queue_size];
}
//whether CircularQueue is empty or not
template<typename T>
bool CircularQueue<T>::empty(){
	return front == rear ? true : false;
}
//get length
template<typename T>
int CircularQueue<T>::size(){
	return (rear - front + queue_size) % queue_size;
}
//realloc CircularQueue size
template<typename T>
void CircularQueue<T>::renew(int size){
	T* p = element;
	element = new T[size];
	int i = 0;
	while (front%queue_size != rear){
		element[i++] = p[front++];
	}
	front = 0;
	rear = queue_size - 1;
}

#endif
main.cpp

#include"CircularQueue.h"
using namespace std;

int main(){
	CircularQueue<int> int_queue;
	cout << int_queue.size() << endl; //0
	cout << boolalpha << int_queue.empty() << endl;//true

	for (int i = 1; i < 10; i++){
		int_queue.push(i);
	}

	cout << int_queue.size() << endl; //9
	cout << int_queue.get_front() << endl;//1
	cout << int_queue.get_back() << endl;//9
	cout << boolalpha << int_queue.empty() << endl;//false

	int_queue.pop();
	int_queue.pop();
	int_queue.pop();
	cout << int_queue.get_front() << endl;//4
	cout << int_queue.get_back() << endl;//9

	int_queue.push(10);
	int_queue.push(11);
	cout << int_queue.get_front() << endl;//4
	cout << int_queue.get_back() << endl;//11

	int_queue.push(12);
	int_queue.push(13);
	int_queue.push(14);
	cout << int_queue.size() << endl; //11
	cout << int_queue.get_front() << endl;//4
	cout << int_queue.get_back() << endl;//14

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值