环形队列,用tag来标记队列的空(0)与满(1)

本文介绍了一个使用模板类实现的队列结构——QueueTag,该队列采用顺序表的形式,并详细展示了其成员函数的定义及实现过程。QueueTag通过标记来区分队列的空或满状态,有效避免了“假溢出”的问题。

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

#ifndef QUEUETAG_H
#define QUEUETAG_H

#include
#include
using namespace std;


//顺序表形式的队列,在顺序表的队列定义中一定要注意防止"假溢出"现象的出现
template
class QueueTag{

private:
	int front;//队头
	int rear;//队尾
	int currSize;//当前队列中的元素个数
	int maxSize;
	bool tag = false;//标记队列是空或满,当tag=true时,为非空
	T* str = NULL;//存取数据的空间


public:
	QueueTag(int size);
	~QueueTag();

	void Clear();
	void EnQueue(const T value);
	void DeQueue();
	T ReQueue();
	T ReAndDeQueue();
	bool isFull();
	bool isEmpty();
	int Length();
	void Print();

};
template
QueueTag::QueueTag(int size)
{
	maxSize = size;
	str = new T[maxSize];
	front = 0;
	rear = 0;
}

template
QueueTag::~QueueTag()
{
	delete[]str;
}

template
void QueueTag::Clear()
{
	//在清空函数中,不仅需要将front=rear,且需要将标记tag=false;
	tag = false;
	front = rear = 0;
	currSize = 0;
}

template
void QueueTag::EnQueue(const T value)
{
	if (tag)
	{
		//tag=true,此时队列为满状态
		cout << "队列为满!" << endl;
		return;
	}
	str[rear] = value;
	rear = (rear + 1) % maxSize;
	currSize++;
	if (front == rear)
	{
		//如果队列状态为满时,则tag=true
		tag = true;
	}
}

template
void QueueTag::DeQueue()
{
	if (!tag&&front==rear)
	{
		//如果状态为空时,则不进行出队操作
		cout << "队列为空!" << endl;
		return;
	}
	front = (front + 1) % maxSize;
	currSize--;
	if (front == rear&&currSize==0)
	{
		//当状态为空时,则tag=false;
		tag = false;
	}
}

template
T QueueTag::ReQueue()
{
	if (!tag&&front==rear)
	{
		cout << "队列为空!" << endl;
		return -1;
	}
	T data = str[front];
	return data;
}

template
T QueueTag::ReAndDeQueue()
{
	T data = ReQueue();
	DeQueue();
	return data;
}

template
bool QueueTag::isFull()
{
	if (tag)
		return false;
	return true;
}

template
bool QueueTag::isEmpty()
{
	if (!tag)
		return true;
	return false;
}

template
int QueueTag::Length()
{
	return currSize;
}

template
void QueueTag::Print()
{
	if (!tag&&front==rear)
		return;
	int i;
	if (front < rear)
	{
		for (int i = front; i < rear; i++)
		{
			cout << str[i] << " ";
		}
	}
	else
	{
		for (int i = front; i < maxSize; i++)
		{
			cout << str[i] << " ";
		}
		for (int i = 0; i < rear; i++)
		{
			cout << str[i] << " ";
		}
	}
	cout << endl;
}

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值