一、题目
设队列的元素类型为char,实现顺序循环队列的各种基本操作的程序:
① 初始化队列Q;
② 判断队列Q是否为空;
③ 入队操作。循环调用入队操作,将若干元素(不少于10个)入队;
④ 出队操作,出队一个元素,并输出该元素;
⑤ 输出队列元素个数;
⑥ 调用入队操作,依次入队4个元素;
⑦ 输出队列序列;
⑧ 主函数通过函数调用实现以上各项操作。
二、算法思路
1、定义队列结构体:包括数组首元素地址,首元素数组下标(首指针),尾元素数组下标(尾指针)。
2、初始化循环队列的函数:在内存中开辟一段连续的内存空间储存数组的元素,将首指针和尾指针均赋值为0。
3、队列判空函数:若首指针等于为指针,则队列为空。
4、判断队列是否已满的函数:若(Q->rear+1)%MAX_SIZE==Q->front
即队尾即将追上队头,则队列已满。
5、入队操作:若队列未满,则为尾指针指向的元素赋值,再将尾指针后移一位,若尾指针达到最大值,则将尾指针重置为0。
6、出队操作:若队列不为空,则出队一个元素,并用e储存该元素,再将头指针后移一位,若头指针达到最大值,则将头指针重置为0。
7、输出元素个数的函数:返回(Q->rear - Q->front + MAX_SIZE) % MAX_SIZE
8、输出队列元素:利用循环打印队列中的元素。
9、主函数:依次调用上述函数实现程序功能。
三、完整代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char ElemType;
typedef int Status;
#define MAX_SIZE 6 //队列最多能存储MAX_SIZE-1个元素,多出来的一份空间不放元素,用于判断队列是否已满
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define OK 1
typedef struct Queue {
ElemType *data;
int front;//头指针(用数组下标表示)
int rear;//尾指针(用数组下标表示)
};
void InitQueue(Queue*Q)//初始化队列的函数
{
Q->data = (ElemType*)malloc(sizeof(ElemType) * MAX_SIZE);
Q->front = Q->rear = 0;//头指针和尾指针都为0,队列为空
}
Status QueueEmpty(Queue* Q)//队列判空函数
{
if (Q->front == Q->rear)//为空返回TRUE
return TRUE;
else//否则返回FALSE
return FALSE;
}
Status QueueFull(Queue* Q)//判断队列是否已满的函数
{
if ((Q->rear+1)%MAX_SIZE==Q->front)//若队尾即将追上队头,则队列已满,返回TRUE
return TRUE;
else//否则返回FALSE
return FALSE;
}
Status AddElem(Queue* Q)//入队操作
{
if (QueueFull(Q))//判断队列是否已满
return ERROR;
getchar();//吸收上一次输入后字符结尾处的\n(我想了半天才想到这一点!)
Q->data[Q->rear] = getchar();
Q->rear = (Q->rear + 1) % MAX_SIZE;//尾指针向后移动一位,若rear为MAX_SIZE-1,则将rear重置为0
return OK;
}
void AddSomeElem(Queue* Q)//入队若干元素的操作
{
int n;
printf("请输入需要入队的元素个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("请输入第%d个元素的值:", i + 1);
if (!AddElem(Q))//入队操作
{
printf("队列已满!");
break;
}
}
}
Status DeleteElem(Queue* Q,ElemType*e)//出队操作,出队一个元素,并用e储存该元素
{
if (QueueEmpty(Q))//判断队列是否为空
return ERROR;
else
{
*e = Q->data[Q->front];
Q->front = (Q->front + 1) % MAX_SIZE;//尾指针向后移动一位,若front为MAX_SIZE-1,则将front重置为0
}
return OK;
}
int NumQueue(Queue* Q)//输出元素个数
{
return (Q->rear - Q->front + MAX_SIZE) % MAX_SIZE;
}
void PrintQueue(Queue* Q)//输出队列元素
{
printf("队列中的元素为:");
for (Q->front; Q->front != Q->rear; Q->front=(Q->front+1)%MAX_SIZE)//打印下标从Q->front到Q->rear-1的数组元素
printf("%c ", Q->data[Q->front]);
}
int main()
{
Queue* Q = (Queue*)malloc(sizeof(Queue));
InitQueue(Q);//初始化队列的函数
if (QueueEmpty(Q))
printf("队列为空!\n");
else
printf("队列不为空!\n");
AddSomeElem(Q);//入队十个以上元素
if (QueueEmpty(Q))
printf("队列为空!\n");
else
printf("队列不为空!\n");
char* e = (ElemType*)malloc(sizeof(ElemType));
DeleteElem(Q,e);//出队一个元素
printf("出队元素的值是:%c\n", *e);
printf("队列中的元素数量是:%d\n", NumQueue(Q));//输出元素个数的函数
AddSomeElem(Q);//入队四个元素
PrintQueue(Q);//输出队列元素
}
四、运行结果