一、实验目的
1.掌握循环队列的定义及初始化、创建、求长、输出、判断队空、判断队满、销毁、入队、出队等基本操作。
2.使用C/C++写出循环队列。
3. 了解顺序队列相较于顺序表的特殊性,能在不同情况下选择合适的存储方式。
二、实验要求
1.写出循环队列的线性存储和操作;
三、实验过程
实验环境:visual studio 2017
实验步骤:
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. |