创建空的环形队列:要求按照完成顺序队列的数据类型定义,并初始化一个空的顺序队列。
队列为空判断:当队列中无数据元素时队列为空,队列为空时不能进行出队操作。本关任务是完成判断环形队列是否为空。
队列为满判断:顺序队列存储数据元素的个数由队列存储容量MAXNUM决定,当队列中存放的数据元素个数已达最大时,不能再向队列中插入数据元素(入队)以防止上溢。要求完成判断环形队列是否为满的操作。
入队:实现队列的插入操作(入队)。
出队:实现队列删除操作(出队)。队列操作特性是:删除只能在队首进行,本操作要求删除队首元素并返回删除的元素。
取队首元素:返回队首元素。
#include <stdio.h>
#include <stdlib.h>
/* 此处是顺序队列数据结构定义 */
typedef int DataType;
struct seqQueue // 顺序队列结构体
{
int front, rear; // 用于存放顺序队列的队首和队尾索引
int MAXNUM; // 用于记录顺序队列中能存放的最大元素个数
DataType *element; // 用于存放数据元素的连续空间的起始地址
};
typedef struct seqQueue *PseqQueue;
// 第一关:创建一个空的顺序队列
PseqQueue createNullQueue_seq(int m)
{
// 此处填写代码,创建一个空的顺序队列,能存放的最大元素个数为 m
// 若 m=0,则返回 NULL
PseqQueue Q = (PseqQueue)malloc(sizeof(struct seqQueue));
if (Q)
{
if (m == 0)
return NULL;
Q->element = (DataType *)malloc(sizeof(DataType) * m);
if (Q->element)
{
Q->front = Q->rear = 0;
Q->MAXNUM = m;
return Q;
}
else
free(Q);
}
return 0;
}
// 第二关:判断顺序队列是否为空
int isNullQueue_seq(PseqQueue Q)
{
// 判断顺序(环形)队列是否为空,若为空,返回值为 1,否则返回值为 0
// 若队列不存在,则返回 -1
if (Q == NULL)
return -1;
else if (Q->front == Q->rear)
return 1;
else
return 0;
}
// 第三关:判断环形队列是否已满
int isFullQueue_seq(PseqQueue Q)
{
// 判断环形队列是否已满,若已满,返回值为 1,否则返回值为 0
if ((Q->rear + 1) % Q->MAXNUM == Q->front)
return 1;
return 0;
}
// 第四关:在环形队列中插入数据元素
int enQueue_seq(PseqQueue Q, DataType x)
{
// 在环形队列中插入数据元素 x,若插入不成功,返回 0;插入成功返回值为 1
if ((Q->rear + 1) % Q->MAXNUM == Q->front)
return 0;
Q->element[Q->rear] = x;
Q->rear = (Q->rear + 1) % Q->MAXNUM;
return 1;
}
// 第五关:出队并返回删除元素
DataType delQueue_seq(PseqQueue Q)
{
// 出队并返回删除元素,若队列为空,则返回 -1
if (Q->front == Q->rear)
return -1;
Q->front = (Q->front + 1) % Q->MAXNUM;
return Q->element[Q->front - 1];
}
// 第六关:取队首元素返回
DataType front_seq(PseqQueue Q)
{
// 取队首元素返回,若队列为空,则返回 -1
if (Q->front == Q->rear)
return -1;
return Q->element[Q->front];
}
这段代码实现了以下功能:
-
创建空的顺序队列:
PseqQueue createNullQueue_seq(int m)
- 创建一个空的顺序队列,能存放的最大元素个数为
m
。 - 若
m=0
,返回NULL
。 - 返回指向顺序队列的指针。
- 创建一个空的顺序队列,能存放的最大元素个数为
-
判断顺序队列是否为空:
int isNullQueue_seq(PseqQueue Q)
- 判断顺序队列是否为空。
- 若为空,返回值为
1
,否则返回值为0
。 - 若队列不存在(指针为空),返回
-1
。
-
判断环形队列是否已满:
int isFullQueue_seq(PseqQueue Q)
- 判断环形队列是否已满。
- 若已满,返回值为
1
,否则返回值为0
。
-
在环形队列中插入数据元素:
int enQueue_seq(PseqQueue Q, DataType x)
- 在环形队列中插入数据元素
x
。 - 若插入不成功(队列已满),返回
0
;插入成功返回值为1
。
- 在环形队列中插入数据元素
-
出队并返回删除元素:
DataType delQueue_seq(PseqQueue Q)
- 出队并返回删除元素。
- 若队列为空,返回
-1
。
-
取队首元素返回:
DataType front_seq(PseqQueue Q)
- 取队首元素返回。
- 若队列为空,返回
-1
。