震惊我和数据结构不得不说的故事:数据结构(循环队列)--004

在上一篇中我和大家说的是一种不能重复使用的队列,接下来我和大家讲的是可以循环使用的队列!

其实循环队列的定义和前面所讲的差不多,但是为了队列的循环使用;在每一次插入元素时,对尾指针的操作进行了改动,

即每插入一个元素我们就=={ L->rear=(L->rear+1)%Maxsize ;}——"%"运算符的作用我在上一篇已经和大家讲述过;然后每一个元素出队我们就=={L->front=(L->front+1)%Maxsize;}——;在判断队列是否为满时我们就=={ (L->rear+1)%Maxsize==L->front ;};

总得改处大概就这三个地方和无法循环使用的队列相比,下面是具体的代码段可能多一点但是可以直接粘贴复制到编译器中的,运行环境是vc2010教育版,有需要的可以扫码进群或者加我qq:2105442847(加备注:CSDN):

#include<iostream>
#include<stdio.h>
#include<string>

#define MaxSize	5
//队列练习
typedef struct _Queue {

	int queue[MaxSize];//定义队列的最大长度
	int front;        //头指针(此指针并非真正的指针)
	int rear;         //尾指针(此指针并非真正的指针)
}Squeue;

bool IsFull(Squeue* L);    //函数声明

//初始化一个空的队列
void InitQueue(Squeue* L)
{
	if (!L) return;
	L->front = L->rear = 0;

}

//入队操作
bool goQueue(Squeue* L, int a)
{
        //判断队列是否进行了初始化
	if (!L) return false;
	//IsFull(L)函数实现在外部,作用是判断队列是否为满
	if (IsFull(L)) {
		return false;
	}
	L->queue[L->rear] = a;
        //此处大家可以自行演示一下,总之就是对队列的最大长度取模
	L->rear = (L->rear + 1) % MaxSize;
	return true;
}
//判断队列是否为满
bool IsFull(Squeue* L)
{
	if (!L) return false;
        
        //这里L->rear+1的原因是在队列中头指针和尾指针相隔一个空位
	if ((L->rear + 1) % MaxSize == L->front)
	{
		std::cout << "队列已满!" << std::endl;
		return true;
	}
	return false;
}
//判断队列是否为空·
bool IsEmpty(Squeue* L)
{
	if (!L) return false;
	if (L->front ==L->rear)
	{
		std::cout << "只是一个空队列!" << std::endl;
		return true;
	}
	return false;
}
//打印队列中的元素

void printfQueue(Squeue* L)
{
	if (!L) return;
	int i = L->front;
	while (i!= L->rear)
	{
		std::cout <<"\t"<< L->queue[i];
		i = (i + 1) % MaxSize;
	}
	std::cout<<std::endl;
}
//出队操作
bool outQueue(Squeue* L)
{
	if (!L|| IsEmpty(L)) return false;

	int date = L->queue[L->front];
	L->front = (L->front + 1) % MaxSize;
	std::cout << "出队的值为:"<<date << std::endl;

	return true;


}

int main(void) {

	//创建一个空的空的队列
	Squeue *QL = new Squeue;

	//初始化一个空的队列
	InitQueue(QL);
	int n,a;
	//入队操作
	std::cout << "请输入要入队的个数:";
	std::cin >> n;
	for (int i = 0; i < n; i++)
	{
		std::cout << "请输入要入队的值:";
		std::cin >> a;
		if (goQueue(QL, a)) {
			std::cout << "插入成功!" << std::endl;
		}
		else {
			std::cout << "插入失败!" << std::endl;
		}
	}
	printfQueue(QL);
	//出队操作
	std::cout << "请输入要出队的个数:";
	std::cin >> n;
	for (int i = 0; i < n; i++)
	{
		std::cout << "第"<<i+1<<"个出队:";
		
		if (outQueue(QL)) {
			std::cout << "出队成功!" << std::endl;
		}
		else {
			std::cout << "出队失败!" << std::endl;
		}
	}
	printfQueue(QL);
	
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值