环形队列的基本运算算法-数据结构教程

环形队列的基本概念

请添加图片描述

如图,其实它就是一个队列,就是有点难理解而已,它避免了普通队列的缺点,一样有队列头,队列尾,一样是先进先出的原则。我们采用顺时针的方式来对队列进行排序。

队列头(front) :允许进行删除的一端称为队首。
队列尾(rear) :允许进行插入的一端称为队尾。

环形队列的实现:

在计算机中,是没有环形的内存的,只是我们将顺序的内存处理过,让某一段内存形成环形,使他们首尾相连,简单来说,就是一个数组,只不过有两个指针,一个指向列队头,一个指向列队尾。指向列队头的指针(front)是缓冲区可读的数据,指向列队尾的指针(Tail)是缓冲区可写的数据,通过移动这两个指针(front)和(rear)即可对缓冲区的数据进行读写操作了,直到缓冲区已满(头尾相接),将数据处理完,可以释放掉数据,又可以进行存储新的数据了。

实现的原理:

初始化的时候,列队头与列队尾都指向0,当有数据存储的时候,数据存储在‘0’的地址空间,列队尾指向下一个可以存储数据的地方‘1’,再有数据来的时候,存储数据到地址‘1’,然后队列尾指向下一个地址‘2’。当数据要进行处理的时候,肯定是先处理‘0’空间的数据,也就是列队头的数据,处理完了数据,‘0’地址空间的数据进行释放掉,列队头指向下一个可以处理数据的地址‘1’。从而实现整个环形缓冲区的数据读写。

请添加图片描述

如图,队列头就是指向已经存储的数据,并且这个数据是待处理的。下一个CPU处理的数据就是1;而队列尾则指向可以进行写数据的地址。当1处理了,就会把1释放掉。并且把队列头指向2。当写入了一个数据6,那么队列尾指针就会指向下一个可以写的地址。

请添加图片描述

如果你懂了环形队列,那就来完成这道实验题吧:

实验题:实现环形队列的各种基本运算的算法

目的:领会环形队列存储结构和掌握环形队列中的各种基本运算算法设计
内容:编写一个sqqueue.cpp,实现环形队列(假设栈中元素类型Elem Type为char)的各种基本运算,并在此基础上设计一个程序exp3-3.cpp完成以下功能。

  • (1)初始化队列q。
  • (2)判断队列q是否非空。
  • (3)依次进队元素a,b,c。
  • (4)出队一个元素,输出该元素。
  • (5)依次进队元素d,e,f。
  • (6)输出出队序列。
  • (7)释放序列。

代码演示:

  • sqqueue.cpp
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef char ElemType;
//队列中元素个数不超过MaxSize,所有元素都具有ElemType数据类型,顺序队SqQueue声明如下;
typedef struct
{
	ElemType data[MaxSize];
	int front,rear;
}SqQueue;
//实现队列的基本运算算法如下。
//(1)初始化队列
void InitQueue(SqQueue * &q)
{
	q=(SqQueue *)malloc(sizeof(SqQueue));
	q->front=q->rear=0;
}

//(2)销毁队列
void DestroyQueue(SqQueue * &q)
{
	free(q);
}

//(3)判断队列是否为空
bool QueueEmpty(SqQueue *q)
{
	return(q->front==q->rear);
}

//(4)进队列
bool enQueue(SqQueue *&q,ElemType e)
{
	if((q->rear+1)%MaxSize==q->front)
		return false;
	q->rear=(q->rear+1)%MaxSize;
	q->data[q->rear]=e;
	return true;
}

//(5)出队列
bool deQueue(SqQueue * &q,ElemType &e)
{
	if(q->front==q->rear)
		return false;
	q->front=(q->front+1)%MaxSize;
	e=q->data[q->front];
	return true;
}

代码演示:

  • exp3-3.cpp
#include "sqqueue.cpp"
int main()
{
	ElemType e;
	SqQueue *q;
	printf("环形队列的基本运算如下:\n");
	printf("(1)初始化队列q\n");
	InitQueue(q);
	printf("(2)依次进队列元素a、b、c\n");
 	enQueue(q,'a');
	enQueue(q,'b');
	enQueue(q,'c');
	printf("(3)队列%s\n",(QueueEmpty(q)?"空":"非空"));
	if(deQueue(q,e)==0)
	printf("队空不能出队\n");
	else
	printf("(4)出队一个元素%c\n",e);
	printf("(5)依次进队d、e、f\n");
	enQueue(q,'d');
	enQueue(q,'e');
	enQueue(q,'f');
	printf("(6)出队序列:");
	while(!QueueEmpty(q))
	{
		deQueue(q,e);
		printf("%c",e);
	}
	printf("\n");
	printf("(7)释放队列\n");
	DestroyQueue(q);
	return 10086;
}

效果图:
在这里插入图片描述
代码下载地址:

链接:https://pan.baidu.com/s/1YLpeFvb2zUc7cVXd43FPJA
提取码:uetv

  • 13
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我与你与星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值