循环队列的简单实现

/*1、意义上实现循环,则当队尾指针+1对最大空间(数组长度)取模等于队头时,队满,当q.rear=q.front时,队空,两者的判断条件不同,

因为当插入满时,q.front=q.rear,与队空时一样。

 2、注:入队时,队尾向后追队头(队头指向第一个元素前一个位置),出队时,队头向后追队尾(队尾指向最后一个元素)。

 3、队头与队尾的指向的元素在对中的相对位置始终是不变的,只是本身的位置在变

 4、不能只用q.rear==q.frontq.front==q.rear来判断队满或队空,同理IsFULL(*)函数同样不能*/

 

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

//作者RicardoMTan

 

#include"stdafx.h"

#include<iostream>

#include"malloc.h"

 

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

 

//switch操作指令集,避免魔数问题

enumDOS{

   EXIT,InitQ,EnQ,DeQ,Qf

}Dos;//别名

 

typedefintDataType;

typedefstructQueue{

   intfront;//队头

   intrear;//队尾

   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,DataTypevalue){

   //printf("EnF:front:%d\n   rear: %d\n", q.front, q.rear);

   boola = 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{

        returnq.data[q.front];

   }

   //printf("front:%d\nrear:%d\n", q.front, q.rear);

}

 

//控制块

void Operate(LoopQueue&q){

   intk;

   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 =(enumDOS)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");

   return0;

}

猜你喜欢

转载自blog.csdn.net/ricardomtan/article/details/70833446