数据结构实验 5 循环队列的实现

一、实验目的

1.掌握循环队列的定义及初始化、创建、求长、输出、判断队空、判断队满、销毁、入队、出队等基本操作。

2.使用C/C++写出循环队列。

3. 了解顺序队列相较于顺序表的特殊性,能在不同情况下选择合适的存储方式。

二、实验要求

1.写出循环队列的线性存储和操作;

三、实验过程

实验环境:visual studio 2017

实验步骤:

  1. 初始化循环队列Q,定义函数名为Init_SQueue;
  2. 创建循环队列Q,定义函数名为Create_SQueue;
  3. 求循环队列Q的长度(元素个数),定义函数名为Length_SQueue;
  4. 打印循环队列Q,定义函数名为Print_SQueue;
  5. 判断循环队列Q是否为空,定义函数名为Empty_SQueue;
  6. 判断循环队列Q是否已满,定义函数名为Full_SQueue;
  7. 销毁循环队列Q,定义函数名为Destory_SQueue;
  8. 元素入队,定义函数名为Enqueue;
  9. 元素出队,定义函数名为Dequeue;

SQueue.h 

#define ELEMTYPE int   //定义一个标识符来表示循环队列内元素的类型
#define MAXSIZE 10     //定义一个标识符来表示循环队列内元素的最大个数
#include      //调用头文件
#include     //调用头文件

typedef struct     //构建一个结构体存储循环队列相关信息
{
	ELEMTYPE* data;     //定义一个数组存放循环队列中的元素
	int front;           //定义整型变量front表示队头指针,即第一个元素的前一个位置的索引
	int rear;			//定义整型变量rear表示队尾指针,即最后一个元素的索引
}SQueue;   //结构名为SQueue

void Init_SQueue(SQueue* Q);						//声明初始化函数——Init_SQueue
void Create_SQueue(SQueue* Q);					//声明创建函数——Create_SQueue
int Length_SQueue(SQueue Q);					//声明求长函数——Length_SQueue
void Print_SQueue(SQueue Q);						//声明打印函数——Print_SQueue
bool Empty_SQueue(SQueue);						//声明判断队空函数——Empty_SQueue
bool Full_SQueue(SQueue);						//声明判断队满函数——Full_SQueue
void Destory_SQueue(SQueue* Q);					//声明销毁函数——Destory_SQueue
void Enqueue(SQueue* Q,ELEMTYPE e);				//声明入队函数——Enqueue
void Dequeue(SQueue* Q,ELEMTYPE* e);				//声明出队函数——Dequeue

SQueue.c

#include "SQueue.h"				 //调用头文件

void Init_SQueue(SQueue* Q)		//初始化循环队列
{
	Q->data = (ELEMTYPE*)malloc(sizeof(ELEMTYPE)*MAXSIZE);		//开辟一块空间存放数组
	Q->front = Q->rear = -1;										//队头指针和队尾指针置为-1
}

void Create_SQueue(SQueue* Q)    //创建循环队列
{
	int length;								//定义整型变量length表示队长
	do
	{
		printf("Please input the length:");     //提示输入队列长度
		scanf("%d", &length);                   //输入队列长度
		if (length >= MAXSIZE || length < 0)						//判断输入长度是否合法
			printf("The length is illegal.\n");	//提示输入的长度非法
	} while (length >= MAXSIZE || length < 0);			    //循环队列数组留一个空位以判断队满队空,所以lengthdata[i]);            //输入队列元素
	}
	Q->rear = (length - 1) % MAXSIZE;		//设置队尾指针
	printf("\n");                            //换行
}

int Length_SQueue(SQueue Q)				//求队列长度
{
	if (Q.rear >= Q.front)				//当队尾指针在队头指针后面时
		return Q.rear - Q.front;			//长度即为Q->rear - Q->front
	else									//当队尾指针在队头指针前面时
		return MAXSIZE - Q.front + Q.rear;//长度即为MAXSIZE - Q.front + Q.rear
}

void Print_SQueue(SQueue Q)				//打印队列
{
	printf("The Queue is:");			//提示打印队列
	while (Q.front != Q.rear)			//遍历队列
	{
		Q.front++;						//队头指针向后挪动
		printf("%d ", Q.data[Q.front]); //打印队列元素
	}
	printf("\n");                       //换行
}

bool Empty_SQueue(SQueue Q)				//判断队空
{
	if (Q.front == Q.rear)				//如果队头指针和队尾指针相等
		return true;					//队空
	else								//队头指针和队尾指针不相等
		return false;					//队非空
}

bool Full_SQueue(SQueue Q)				//判断队满
{
	if (Length_SQueue(Q) == MAXSIZE - 1)	//如果队长等于最大元素个数
		return true;					//队满
	else								//如果队长不等于最大元素个数
		return false;					//队非满
}

void Destory_SQueue(SQueue* Q)			//销毁队列
{
	free(Q->data);						//释放队列Q所占空间
	Q->data = NULL;						//指针Q->data置为空
	Q->front = Q->rear = -1;			//队头指针和队尾指针置为-1
}

void Enqueue(SQueue* Q, ELEMTYPE e)		//元素e入队
{
	if (Full_SQueue(*Q))				//判断队列已满
	{
		printf("Enqueue faild.\n");		//入队失败
		return;							//退出函数
	}
	else								//队列未满
	{
		Q->rear = (Q->rear + 1) % MAXSIZE;		//更新队尾指针
		Q->data[Q->rear] = e;					//更新队尾元素
	}
}

void Dequeue(SQueue* Q, ELEMTYPE* e)			//队头元素出队
{
	if (Empty_SQueue(*Q))						//判断队空
	{
		printf("Dequeue faild.\n");				//出队失败
		return;									//退出函数
	}
	else										//队非空
	{
		Q->front = (Q->front + 1) % MAXSIZE;	//更新队头指针
		*e = Q->data[Q->front];					//队头元素出队
	}
}

Test_Init_Create_Print.c

#include "SQueue.h"    //调用头文件

int main(void)    //main()函数
{
	SQueue Q;          //定义一个队列Q
	Init_SQueue(&Q);     //调用Init_SQueue函数将队列初始化
	Create_SQueue(&Q);    //调用Create_SQueue函数创建队列
	Print_SQueue(Q);      //调用Print_SQueue函数打印队列
	return 0;          //返回值
}

Test_Length.c

#include "SQueue.h"    //调用头文件

int main(void)    //main()函数
{
	SQueue Q;          //定义一个队列Q
	Init_SQueue(&Q);     //调用Init_SQueue函数将队列初始化
	Create_SQueue(&Q);    //调用Create_SQueue函数创建队列
	Print_SQueue(Q);      //调用Print_SQueue函数打印队列
	printf("The queue's length is:%d\n", Length_SQueue(Q));     
    //调用Length_SQueue函数求队列长度
	return 0;          //返回值
}

Test_Empty.c

#include "SQueue.h"    //调用头文件

int main(void)    //main()函数
{
	SQueue Q;          //定义一个队列Q
	Init_SQueue(&Q);     //调用Init_SQueue函数将队列初始化
	Create_SQueue(&Q);    //调用Create_SQueue函数创建队列
	Print_SQueue(Q);      //调用Print_SQueue函数打印队列
	printf("The queue's length is:%d\n", Length_SQueue(Q));     //调用Length_SQueue函数求队列长度
	//调用Empty_SQueue函数判断队列是否为空
	if (Empty_SQueue(Q) == 1)				//函数返回值为1,即队空	
		printf("The squeue is empty.\n");		//打印队空
	else									//函数返回值为0,即队非空
		printf("The squeue isn't empty.\n");	//打印队非空
	return 0;          //返回值
}

Test_Full.c

#include "SQueue.h"    //调用头文件

int main(void)    //main()函数
{
	SQueue Q;          //定义一个队列Q
	Init_SQueue(&Q);     //调用Init_SQueue函数将队列初始化
	Create_SQueue(&Q);    //调用Create_SQueue函数创建队列
	Print_SQueue(Q);      //调用Print_SQueue函数打印队列
	printf("The queue's length is:%d\n", Length_SQueue(Q));     //调用Length_SQueue函数求队列长度
	//调用Full_SQueue函数判断队列是否满
	if (Full_SQueue(Q) == 1)				//函数返回值为1,即队满
		printf("The squeue is full.\n");		//打印队满
	else									//函数返回值为0,即队非满
		printf("The squeue isn't full.\n");	//打印队非满
	return 0;          //返回值
}

Test_Enqueue.c

#include "SQueue.h"    //调用头文件

int main(void)    //main()函数
{
	SQueue Q;          //定义一个队列Q
	Init_SQueue(&Q);     //调用Init_SQueue函数将队列初始化
	Create_SQueue(&Q);    //调用Create_SQueue函数创建队列
	Print_SQueue(Q);      //调用Print_SQueue函数打印队列
	printf("The queue's length is:%d\n", Length_SQueue(Q));     //调用Length_SQueue函数求队列长度
	ELEMTYPE e;														//定义ELEMTYPE类型变量e
	printf("Please input the element you want to enqueue:");		//提示输入待入队元素e
	scanf("%d", &e);												//输入待入队元素e
	Enqueue(&Q,e);    //调用Enqueue函数将元素e入队
	Print_SQueue(Q);      //调用Print_SQueue函数打印队列
	printf("The queue's length is:%d\n", Length_SQueue(Q));     //调用Length_SQueue函数求队列长度
	return 0;          //返回值
}

Test_Dequeue.c

#include "SQueue.h"    //调用头文件

int main(void)    //main()函数
{
	SQueue Q;          //定义一个队列Q
	Init_SQueue(&Q);     //调用Init_SQueue函数将队列初始化
	Create_SQueue(&Q);    //调用Create_SQueue函数创建队列
	Print_SQueue(Q);      //调用Print_SQueue函数打印队列
	printf("The queue's length is:%d\n", Length_SQueue(Q));     //调用Length_SQueue函数求队列长度
	ELEMTYPE e;														//定义ELEMTYPE类型变量e
	Dequeue(&Q, &e);    //调用Dequeue函数队头元素出队并赋值给e
	Print_SQueue(Q);      //调用Print_SQueue函数打印队列
	printf("The queue's length is:%d\n", Length_SQueue(Q));     //调用Length_SQueue函数求队列长度
	return 0;          //返回值
}

四、实验结果及分析

循环队列

测试函数

测试用例

运行结果

Init_SQueue Creat_SQueue

Print_SQueue

5

1,2,3,4,5

Please input the length:5

Please input the data:1

Please input the data:2

Please input the data:3

Please input the data:4

Please input the data:5

The queue is:1 2 3 4 5

0

Please input the length:0

The queue is:

Length_SQueue

5

1,2,3,4,5

The queue's length is:5

0

The queue's length is:0

Empty_SQueue

5

1,2,3,4,5

The squeue isn't empty.

0

The squeue is empty.

Full_SQueue

9

1,2,3,4,5,6,7,8,9

The squeue is full.

5

1,2,3,4,5

The squeue isn't full.

Enqueue

9

1,2,3,4,5,6,7,8,9

10

Please input the element you want to enqueue:10

Enqueue faild.

5

1,2,3,4,5

6

Please input the element you want to enqueue:6

The Queue is:1 2 3 4 5 6

The queue's length is:6

Dequeue

5

1,2,3,4,5

The Queue is:2 3 4 5

The queue's length is:4

0

Dequeue faild.

你可能感兴趣的:(数据结构(C语言),数据结构,链表)