数据结构之循环队列

本文介绍了一种解决顺序队列出队时需移动大量元素或浪费空间问题的方法——循环队列,并提供了详细的C++实现代码。包括队列的初始化、销毁、清空等操作及如何判断队列是否为空、获取队列长度、队头元素等。

针对顺序队列在出队时需要移动大量元素,或者是浪费空间等问题,实现了基本的循环队列。当然这里实现的循环队列也存在缺陷,就是需要提前定义好大小。

#include <iostream>
using namespace std;

#define MAXSIZE 5

typedef int DataType;

struct SqQueueCy
{
	DataType* base;
	int front;
	int rear;
};

//队列的初始化
bool SqQueueCyInit(SqQueueCy& Q)
{
	Q.base = (DataType*)malloc(MAXSIZE * sizeof(DataType));
	if (!Q.base)
	{
		cout << "malloc init error" << endl;
		return false;
	}

	Q.front = Q.rear = 0;
	return true;
}

//队列销毁
bool SqQueueCyDestroy(SqQueueCy& Q)
{
	free(Q.base);
	Q.base = NULL;
	Q.front = Q.rear = 0;
	return true;
}

//队列清空
bool SqQueueCyClear(SqQueueCy& Q)
{
	Q.front = Q.rear = 0;
	return true;
}

//队列是否为空
bool SqQueueCyEmpty(SqQueueCy Q)
{
	if (Q.rear == Q.front)
		return true;
	else
		return false;
}

//队列的长度
int SqQueueCyLength(SqQueueCy Q)
{
	return ((Q.rear - Q.front + MAXSIZE) % MAXSIZE);
}

//获取队列队头
bool SqQueueCyGetHead(SqQueueCy Q,DataType& e)
{
	if (Q.front == Q.rear)
		return false;
	e = Q.base[Q.front];
	return true;
}

//入队
bool SqQueueCyInsert(SqQueueCy& Q, DataType e)
{
	//为了区分队满和队空
	if ((Q.rear + 1) % MAXSIZE == Q.front)
		return false;

	Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MAXSIZE;//因为队列是循环的,所以要取余,不然会溢出;
	return true;
}

//出队
bool SqQueueCyDelete(SqQueueCy& Q, DataType& e)
{
	if (Q.front == Q.rear)
		return false;

	e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MAXSIZE; //因为队列是循环的,所以要取余,不然会溢出;
}

void SqQueueCyTraverse(SqQueueCy Q,void(*visit)(DataType))
{
	while (Q.front < Q.rear)
	{
		visit(Q.base[Q.front]);
		Q.front++;
	}
	cout << endl;
}


void visit(DataType c)
{
	cout << " " << c;
}

void main()
{
	DataType e0;
	SqQueueCy Q;

	SqQueueCyInit(Q);

	cout << "向队列中插入元素为:";
	for (int i = 1; i <= 5; i++)
	{
		SqQueueCyInsert(Q, i);
	}
	SqQueueCyTraverse(Q, visit);

	cout << "此时队列的长度为:" << SqQueueCyLength(Q) << endl;

	SqQueueCyGetHead(Q, e0);
	cout << "队列的队头为:" << e0 << endl;

	SqQueueCyDelete(Q, e0);
	cout << "队头出队后,队列的长度为:" << SqQueueCyLength(Q) << endl;
	cout << "队头出队后,队列元素为:";
	SqQueueCyTraverse(Q, visit);

	SqQueueCyClear(Q);
	cout << "清空队列后,队列的长度为:" << SqQueueCyLength(Q) << endl;

	system("pause");
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值