C数据结构——循环队列的简单实现

/*1、意义上实现循环,则当队尾指针+1对最大空间(数组长度)取模等于队头时,队满,当q.rear=q.front时,队空,两者的判断条件不同,
因为当插入满时,q.front=q.rear,与队空时一样。
2、注:入队时,队尾向后追队头(队头指向第一个元素前一个位置),出队时,队头向后追队尾(队尾指向最后一个元素)。
3、队头与队尾的指向的元素在对中的相对位置始终是不变的,只是本身的位置在变
4、不能只用q.rear==q.front或q.front==q.rear来判断队满或队空,同理IsFULL(*)函数同样不能*/

//循环队列.cpp:定义控制台应用程序的入口点。
//作者RicardoMTan

#include"stdafx.h"
#include<iostream>
#include"malloc.h"

#define MAX_QUEUE_SIZE 6//循环队列长,可更改

//switch操作指令集,避免“魔数”问题
enum DOS{
	EXIT, InitQ, EnQ, DeQ, Qf
}Dos;//别名

typedef int DataType;
typedef struct Queue{
	int front;//队头
	int rear;//队尾
	DataType data[MAX_QUEUE_SIZE];//队列的一种存储机制--数组
}LoopQueue;

//置空队
void InitQueue(LoopQueue&q){
	q.front = q.rear = 0;
	//printf("front:%d\nrear:%d\n",q.front,q.rear);
}

//判断队满
bool IsFull(LoopQueue&q){
	return ((q.rear + 1) % MAX_QUEUE_SIZE == q.front);
}

//判断队空
bool IsNULL(LoopQueue&q){
	return(q.rear == q.front);
}

//入队
void EnQueue(LoopQueue&q, DataType value){
	//printf("EnF:front:%d\n   rear: %d\n", q.front, q.rear);
	bool a = IsFull(q);
	if (IsFull(q)){//队满,不插入
		printf("队满!插入失败!\n");
		//return;
	}
	else{
		q.data[q.rear] = value;
		q.rear = (q.rear + 1) % MAX_QUEUE_SIZE;
	}
	//printf("EnL:front:%d\n   rear: %d\n\t\t  %d\n", q.front, q.rear,a);
	//可以考虑一次性入队操作,快去试试吧!
	/*while(c='\n'){
	//输入函数
	//c=getchar();//截取输入完成后的操作的Key
	}
	*/
}

//出队
void DeQueue(LoopQueue&q){
	DataType temp;
	//printf("front:%d\nrear:%d\n", q.front, q.rear);
	if (IsNULL(q)){//队空,不执行出队
		printf("队空!\n");
		//return;
	}
	else{
		temp = q.data[q.front];
		q.front = (q.front + 1) % MAX_QUEUE_SIZE;
		printf("出队元素为:%d\n", temp);
	}
	//printf("front:%d\nrear:%d\n", q.front, q.rear);
}

//获取队头
DataType Qfront(LoopQueue &q){
	//printf("front:%d\nrear:%d\n", q.front, q.rear);
	if (IsNULL(q)){
		printf("队空!\n");
		return-1;
	}
	else{
		return q.data[q.front];
	}
	//printf("front:%d\nrear:%d\n", q.front, q.rear);
}

//控制块
void Operate(LoopQueue&q){
	int k;
	DataType value = NULL;
	printf("\t\t\t\t-------------\n");
	printf("\t\t\t\t1-置空对\n");
	printf("\t\t\t\t2-入队\n");
	printf("\t\t\t\t3-出队\n");
	printf("\t\t\t\t4-查看队头\n");
	printf("\t\t\t\t5-退出程序\n");
	printf("\t\t\t\t-------------\n");
	while (!EXIT){
		printf("\t\t\t\t\t\t输入指令:");
		scanf_s("%d", &k);
		Dos = (enum DOS)k;
		switch (Dos)
		{
		caseInitQ:
			InitQueue(q);
			printf("执行成功!\n");
			break;
		caseEnQ:
			printf("输入入队元素值:");
			scanf_s("%d", &value);//注:scanf_s();为VS2017版本前防止输入溢出的输入函数,与scanf();相同,在其他编译器有可能报错
			EnQueue(q, value);
			break;
		caseDeQ:
			DeQueue(q);
			break;
		caseQf:
			printf("%d\n", Qfront(q));
			break;
		caseEXIT:
			return;
			break;
		default:
			printf("命令错误!\n");
			break;
		}
	}
}

//主函数
int main(){
	LoopQueue q;
	Operate(q);
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值