一个比较实用的循环队列

最近任务比较繁重,没什么时间写博客,只能勉强附上之前写的一个还算比较实用的循环队列,工程上可以用得上,敬请笑纳大笑

#pragma once
#include <string>
using namespace std;
#include "Mutex.h"


#define CirQueueSize 1000;
template <class ELEMENT_TYPE>   //循环队列模板类
class CirQueue
{
public:
	CirQueue(void)  //默认大小:CirQueueSize
	{
		Array=NULL;
		MAXSIZE = CirQueueSize;
		Array = new ELEMENT_TYPE[MAXSIZE];
		front = 0;
		rear  = front;
		if(Array == NULL)
			lastError="开辟内存空间失败!";
		else
			lastError="";
	}
	CirQueue(unsigned int size)
	{
		Array=NULL;
		MAXSIZE = size;
		Array = new ELEMENT_TYPE[size];
		front = 0;
		rear  = front;
		if(Array == NULL)
			lastError="开辟内存空间失败!";
		else
			lastError="";
	}
	~CirQueue(void)
	{
		if(Array!=NULL)
			delete[] Array;
	}
	int Length()//循环队形长度
	{
		return (rear + MAXSIZE - front)%MAXSIZE;
	}
	bool isEmpty()//循环队形是否空
	{
		Mutex::Lock lock(_mutex);

		return front == rear;
	}
	bool isFull()//循环队形是否满
	{
		return Length() == MAXSIZE - 1;
	}
	void clear()//循环队形清空
	{
		Mutex::Lock lock(_mutex);

		front=rear;
	}
	ELEMENT_TYPE& operator[](int index)
	{
		return Array[index];
	}

	bool enQueue(const ELEMENT_TYPE& element)//入队
	{
		Mutex::Lock lock(_mutex);

		if(isFull())
		{
			lastError="队列数据已满,插入数据失败!";
			return false;
		}
		Array[rear] = element;             //深复制
		rear = (rear + 1) % MAXSIZE;
		return true;
	}
	bool deQueue(ELEMENT_TYPE& element)     //出队
	{
		Mutex::Lock lock(_mutex);

		if(front == rear)
		{
			lastError="队列为空,读取数据失败!";
			return false;
		}
		element = Array[front];             //深复制	
		front = (front+1) % MAXSIZE;
		return true;
	}
	std::string lastError;

private:
	int front; //头 
	int rear;  //尾
	int MAXSIZE;//元素总数
	ELEMENT_TYPE * Array;
	Mutex _mutex;//互斥变量
};

关于互斥变量Mutex类是使用Qt库封装的互斥类,可以考虑使用其他的如boost库或标准库来实现。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,循环队列是一种非常实用的数据结构,可以用来解决队列操作中的一些常见问题,比如队列满了后如何入队等等。下面是一个用 C 语言实现的循环队列的基本代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 // 队列的最大长度 // 队列结构体 typedef struct { int data[MAX_SIZE]; // 存储队列的数组 int front; // 队首元素的下标 int rear; // 队尾元素的下标 } Queue; // 初始化队列,将队首和队尾的下标都设为0 Queue* createQueue() { Queue* q = (Queue*)malloc(sizeof(Queue)); q->front = q->rear = 0; return q; } // 判断队列是否为空 int isEmpty(Queue* q) { return q->front == q->rear; } // 判断队列是否满了 int isFull(Queue* q) { return (q->rear + 1) % MAX_SIZE == q->front; } // 入队操作 void enqueue(Queue* q, int value) { if (isFull(q)) { printf("Queue is full.\n"); return; } q->data[q->rear] = value; q->rear = (q->rear + 1) % MAX_SIZE; } // 出队操作 int dequeue(Queue* q) { if (isEmpty(q)) { printf("Queue is empty.\n"); return -1; } int value = q->data[q->front]; q->front = (q->front + 1) % MAX_SIZE; return value; } int main() { Queue* q = createQueue(); enqueue(q, 1); enqueue(q, 2); enqueue(q, 3); printf("%d\n", dequeue(q)); enqueue(q, 4); printf("%d\n", dequeue(q)); printf("%d\n", dequeue(q)); printf("%d\n", dequeue(q)); printf("%d\n", dequeue(q)); free(q); return 0; } ``` 以上是一个简单的循环队列实现,主要是通过 `front` 和 `rear` 两个指针来实现队列的循环。当队列为空时,`front` 和 `rear` 都指向相同的位置;当队列已满时,`(rear+1)%MAX_SIZE` 等于 `front`。当队列中有数据时,`front` 和 `rear` 分别指向队首和队尾元素的下标。 入队操作时将值存储到 `rear` 的位置,并将 `rear` 指向 `(rear+1)%MAX_SIZE`;出队操作时将 `front` 指向 `(front+1)%MAX_SIZE`。这样就实现了一个循环队列

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值