/*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;
}