zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于数组的循环队列(C++模板实现)

2023-09-27 14:25:59 时间

循环队列使用数组实现的话,简单、方便。之前实现的队列,当尾端索引到达队列最后的时候,无论前面是否还有空间,都不能再添加数据了。循环队列使得队列的存储单元可以循环利用,它需要一个额外的存储单元来判断队列是否已满。

#pragma once
#ifndef MSGQUEUE_H_
#define MSGQUEUE_H_

#include "SerialApi.h"
#include <queue>
#include <iostream>
using namespace std;

template<typename T>
class MsgQueue{
public:
	MsgQueue(size_t sz);  //构造
	~MsgQueue();

public:
	bool isEmpty();  //判断队列是否为空
	bool isFull();   //判断队列是否为满

	void Push(T &val);   //入队操作
	T Pop();    //出队操作


	T getFront();
	T getRear();

	size_t getRealSize();
private:
	size_t front,rear,size;
	T *data;
};


template<typename T>
MsgQueue<T>::MsgQueue(size_t sz)
{
	rear = front = 0;
	size  = sz + 1;
	data = new T[size];
}

template<typename T>
MsgQueue<T>::~MsgQueue()
{
	delete []data;
}

template<typename T>
bool MsgQueue<T>::isEmpty()
{
	return (front == rear);
}

template<typename T>
bool MsgQueue<T>::isFull()
{
	return (((rear+1) % size) == front);
}

template<typename T>
void MsgQueue<T>::Push(T &val)
{
	if(!isFull())
	{
		data[rear] = val;
		rear = (rear + 1) % size;
	}
	else
	{
		printf("The queue is full!\n");
	}
}

template<typename T>
T MsgQueue<T>::Pop(void )
{
	T temp;
	if(!isEmpty())
	{
		temp = data[front];
		data[front] = NULL;
		front = (front+1) % size;
		return data[temp];
	}
	else
	{
		printf("The queue is empty!\n");
		return ;
	}
}

template<typename T>
T MsgQueue<T>::getFront()
{
	if(isEmpty())
	{
		printf("The queue is empty!\n");
	}
	return data[front];
}

template<typename T>
T MsgQueue<T>::getRear()
{
	return data[rear];
}

template<typename T>
size_t MsgQueue<T>::getRealSize()
{
	size_t realSize = (rear - front + size) % size;
	return realSize;
}

#endif //MSGQUEUE_H_
 
	MsgQueue<int> *Q = new MsgQueue<int>(20);

	for(int i=0;i<20;i++)
	{
        Q->Push(i);
	}
	cout<<Q->getFront()<<endl;
	cout<<Q->getRealSize()<<endl;

 

参考链接:http://www.cnblogs.com/wxxweb/archive/2011/05/26/2059166.html

注意:模板声明和实现要放在同一文件夹中,而不能够把声明放在了.h文件中,把实现放在了.cpp文件中。