循环队列的基本操作

本文介绍了一个使用C语言实现的循环队列操作系统,包括初始化、求队列长度、入队、出队和获取队头元素等功能。通过示例展示了如何使用这些功能进行操作,并在VS2019环境下编译运行。
#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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值