#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
//全局定义特殊变量
#define ok 1
#define OVERFLOW 0
#define MAX 10
//转定义区域
typedef char QElemType;
typedef int status;
typedef struct//定义循环队列
{
QElemType* base;
int front;
int rear;
}SqQueue;
void Interrupt()//中断函数//用于检测换行符,使函数脱离scanf的连续输出
{
while (1)
{
if (getchar() == '\n')
{
break;
}
}
}
status InitQueue(SqQueue &Q)//循环队列的初始化
{
Q.base = (QElemType*)malloc(sizeof(QElemType[MAX]));
if (!Q.base)
{
return OVERFLOW;
}
Q.front = Q.rear=0;
return ok;
}
void Packfun1(SqQueue& Q)
{
int i;
i = InitQueue(Q);
if (i == 1)
{
printf("初始化成功!");
}
else
{
printf("初始化失败!");
}
}
status Queuelength(SqQueue Q)//求队伍长度
{
return (Q.rear - Q.front + MAX) % MAX;
}
status QueueEmpty(SqQueue Q)//判断是否队空
{
if (Q.rear== Q.front)
{
return 1;
}
else
{
return 0;
}
}
void Packfun2(SqQueue Q)//求队伍长度的封装函数
{
int i;
i = QueueEmpty(Q);
if (i == 1)
{
printf("队伍的长度为:0\n");
}
else
{
i = Queuelength(Q);
printf("队伍的长度为:%d\n", i);
}
}
status EnQueue(SqQueue &Q, QElemType e)//入队
{
if ((Q.rear + 1) % MAX == Q.front)//队满的条件
{
return 0;
}
Q.base[Q.rear] = e;
Q.rear = (Q.rear +1) % MAX;
return ok;
}
void Packfun3(SqQueue &Q)
{
int i;
QElemType e;
printf("请输入入队的元素:");
Interrupt();
scanf("%c",&e);
i=EnQueue(Q, e);
if (i = 1)
{
printf("入队成功!");
}
else
{
printf("入队失败!");
}
}
status DeQueue(SqQueue& Q, QElemType &e)//出队
{
if (Q.rear == Q.front)//队空的条件
{
return 0;
}
e=Q.base[Q.front];
Q.front = (Q.front + 1) % MAX;
return ok;
}
void Packfun4(SqQueue& Q)//出队的封装函数
{
int i;
QElemType e;
printf("是否全部出队?(1:是/0:否)");
scanf("%d",&i);
if (i == 1)
{
printf("出队的序列为:");
while (Q.rear != Q.front)
{
DeQueue(Q, e);
printf(" %c",e);
}
}
else
{
printf("出队的元素为:");
DeQueue(Q, e);
printf(" %c", e);
}
}
QElemType GetHead(SqQueue Q)//只取值不出队//取队头元素
{
if (Q.rear != Q.front)
{
return Q.base[Q.front];
}
}
void Packfun5(SqQueue Q)
{
int i;
QElemType T;
i = QueueEmpty(Q);
if (i == 1)
{
printf("队空,无队头元素!\n");
}
else
{
T = GetHead(Q);
printf("队头元素为:%c\n", T);
}
}
int main()
{
int a, f = 0, i = 0;
SqQueue Q;
while (1)
{
printf("\n");
printf("================================\n");
printf("| 循环队列的操作系统 |\n");
printf("================================\n");
printf("| 1.初始化队列 |\n");
printf("| 2.求队列长度 |\n");
printf("| 3.循环队列的入队 |\n");
printf("| 4.循环队列的出队 |\n");
printf("| 5.取队列队头元素 |\n");
printf("| 0.退出队列操作系统 |\n");
printf("================================\n");
printf("请选择功能(0-5):");
mark:scanf("%d", &a);
switch (a)
{
case 0:f = 1; break;
case 1: Packfun1(Q); break;
case 2: Packfun2(Q); break;
case 3: Packfun3(Q); break;
case 4: Packfun4(Q); break;
case 5: Packfun5(Q); break;
default:printf("选择功能错误!请重新选择菜单功能:"); goto mark;
}
if (f == 1)
{
printf("已经退出系统");
break;//该break是为了退出while的无限“菜单”循环
}
}
}
使用的编译环境是vs2019,源文件后缀是.cpp
本文介绍了一个使用C语言实现的循环队列操作系统,包括初始化、求队列长度、入队、出队和获取队头元素等功能。通过示例展示了如何使用这些功能进行操作,并在VS2019环境下编译运行。
3153

被折叠的 条评论
为什么被折叠?



