循环队列的建立及基本操作-数据结构-C语言

实验项目名称:队列的建立及操作

一、 实验目的
1.掌握队列存储结构的表示和实现方法。
2.掌握队列的入队和出队等基本操作的算法实现。
二、 实验题
建立顺序循环队列,并在顺序循环队列上实现入队、出队基本操作。
三、 实验过程及结果
基本思路

  1. 建立顺序循环队列:
    定义一个结构体,成员有三个:数组、头指针(用来表示数组的下标,用于删除元素,即出队)、尾指针(用来表示数组的下标,用于插入元素,即入队)。
  2. 入队:
    需要判断队列是否满了,若不满,则可入队。
  3. 出队:
  4. 需要判断队列是否为空
  5. 思路:
    循环队列的引入:解决队列是假溢出的问题
    建立一个顺序队列,当rear+1=MAXQSIZE时,front有两种情况:
    (1) front=0
    此时是队列真溢出,即队列已满;
    (2) front不等于0
    此时队列是假溢出;
    解决方法:
    引入循环队列,当rear+1=MAXQSIZE时,rear指向数组下标为零的位置,再次利用没有元素的空间,front同理;
    由rear+1变为rear=0的方法:
    取模运算:(rear+1)%MAXQSIZE;
  6. 判断循环队列空和满的条件问题:
    在这里插入图片描述解决方案:
    (1) 另设一个标志元素,以区分队空,队满;
    (2) 另设一个变量,记录元素个数;
    (3)少用一个元素空间;
    解决方案(3)的实现:
    在这里插入图片描述
    全部程序代码:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define MAXQSIZE 100
#define OVERFLOW 0
typedef int QElemType;
typedef int Status;
typedef struct
{
	QElemType *base;//动态分配数组空间 
	int front;//头指针,若队列不为空,指向队列头元素 
	int rear;//尾指针,若队列不为空,指向尾元素的下一个位置 
}SqQueue;
SqQueue Q;

//循环队列的初始化 
Status InitQueue(SqQueue &Q)
{
	Q.base=new QElemType[MAXQSIZE];//分配数组空间  
	/*Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType))*/ 
	if(!Q.base)exit(OVERFLOW);//存储分配失败 
	Q.front=Q.rear=0;
	return OK; 
}

//求队列的长度
int QueueLength(SqQueue Q)
{
	if(!Q.base)return ERROR;
	else
	return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
//入队
Status EnQueue(SqQueue &Q,int n)
{
	QElemType e;
	while(n)
	{
		if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;//队满
		scanf("%d",&e);
	    Q.base[Q.rear]=e;//新元素加入队尾 
	    Q.rear=(Q.rear+1)%MAXQSIZE;//队尾指针加一 
	    n--;
	}
	return OK;
}
//出队
Status DeQueue(SqQueue &Q,int n)
{
	QElemType e;
	if(n<0||n>QueueLength(Q))return ERROR;//出队元素个数不合理 
	while(n)
	{
		if(Q.rear==Q.front)return ERROR;//队空
	    e=Q.base[Q.front];//将此时头元素的值赋给e
	    printf("The DeQueue element is %d\n",e);
	    Q.front=(Q.front+1)%MAXQSIZE;
	    //头指针的值加一
		/*当头指针(Q.front+1)==MAXQSIZE时,如果直接取模运算,则可指向下标为零的位置
		构成一个循环队列*/  
	    n--;
	}
	
	return OK; 
}
//取队头元素
QElemType GetHead(SqQueue Q)
{
	if(Q.rear!=Q.front)//队列不为空 
	return Q.base[Q.front];//直接返回队头指针所指向的元素的值,队头指针不变 
}
//主函数测试
int main()
{
	QElemType e;
	int x,y; 
	if(InitQueue(Q))
	printf("InitQueue success\n");
	printf("请输入入队的元素个数:\n");
	scanf("%d",&x);
	if(EnQueue(Q,x))
	printf("EnQueue success\n");
	printf("The head Element is %d\n",GetHead(Q));
    printf("The length of Queue element is %d\n",QueueLength(Q));
	printf("请输入出队的元素个数:\n");
	scanf("%d",&y);
	if(DeQueue(Q,y));
	printf("DeQueue success\n");
	return 0;	
 }

实验结果:
在这里插入图片描述

  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
循环队列是一种特殊的队列,其特点是队列的元素在物理结构上是环形排列的。educoder实训教学平台提供了循环队列基本操作,包括初始化、入队、出队和判空等。 循环队列的初始化操作是创建一个队列,并设置队列的头指针和尾指针都为0。入队操作是往队尾插入一个元素,插入后尾指针向后移动一位,并将元素放入新的队尾位置。出队操作是将队首元素删除,删除后头指针向后移动一位。判空操作是通过比较队列的头指针和尾指针是否相等来确定队列是否为空。 链队列是使用链表实现的队列,其特点是可以动态地分配内存空间,不会造成内存溢出的问题。educoder实训教学平台也提供了链队列基本操作,包括初始化、入队、出队和判空等。 链队列的初始化操作是创建一个队列,并设置头指针和尾指针都指向空节点。入队操作是在链队列的尾部插入一个新节点,尾指针向后移动一位,并将新节点的数据放入新的尾节点。出队操作是删除链队列的头节点,头指针向后移动一位。判空操作是通过判断链队列的头指针和尾指针是否指向同一节点来确定队列是否为空。 通过educoder实训教学平台提供的循环队列和链队列基本操作,学习者可以掌握数据结构队列的实现方式和基本操作的原理,进而应用于解决一些实际问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值