Q.front == (Q.rear + 1) % MAXSIZE 因为队头指针可能又重新从0位置开始,而此时队尾指针是MAXSIZE - 1,所以需要求余。
当队头和队尾指针在同一位置时,队空。Q.front == Q.rear;
以下是实现的代码:
#include#include#define MAXSIZE 100 //最大队列长度#define OK 1#define ERROR 0 typedefint ElemType; typedefint Status; typedefstruct { ElemType *base;//队列空间int front;//队头指针int rear;//队尾指针,若队尾不为空,则指向队尾元素的下一个位置 }SqQueue; //初始化循环队列 Status initQueue(SqQueue &Q) { Q.base = (ElemType *) malloc(MAXSIZE *sizeof(ElemType));//申请空间 Q.front = Q.rear =0;//队空return OK; } //入队 Status enQueue(SqQueue &Q, ElemType e) {if ((Q.rear +1) % MAXSIZE == Q.front)return ERROR;//队满,无法添加 Q.base[Q.rear] = e;//插入元素 Q.rear = (Q.rear +1) % MAXSIZE;//队尾指针+1return OK; } //出队 Status deQueue(SqQueue &Q, ElemType &e) {if (Q.front == Q.rear)return ERROR;//队空,无法删除 e = Q.base[Q.front]; Q.front = (Q.front +1) % MAXSIZE;//队头指针+1return OK; } //返回队列长度 Status length(SqQueue &Q) {return (Q.rear - Q.front + MAXSIZE) % MAXSIZE; }
因此只凭等式front=rear无法判断队空还是队满。有两种方法处理上述问题: (1)另设一个标志位以区别队列是空还是满。 (2)少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位
为了方便起见,约定:初始化建空队时,令
front=rear=0,
当队空时:front=rear
当队满时:front=rear 亦成立
因此只凭等式front=rear无法判断队空还是队满。 有两种方法处理上述问题:
(1)另设一个标志位以区别队列是空还是满。
(2)少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位置上”作为队列“满”状态的标志。即:
队空时: front=rear
队满时: (rear+1)%maxsize=front
front指向队首元素,rear指向队尾元素的下一个元素。
//author:kangquan2008@csdn#include#include#include#defineQUEUE_SIZE10#defineEN_QUEUE1#defineDE_QUEUE2#defineEXIT3typedefintItem;typedefstructQUEUE{Item*item;intfront;inttear;}Queue;intinit_queue(Queue*queue){queue->item=malloc(QUEUE_SIZE*sizeof(Item));if(!queue->item){printf("%s\n","Allocfailed,notmemoryenough");exit(EXIT_FAILURE);}queue->front=queue->tear=0;return1;}inten_queue(Queue*queue,Itemitem){if((queue->tear+1)%QUEUE_SIZE==queue->front){printf("%s\n","Thequeueisfull");return-1;}queue->item[queue->tear]=item;queue->tear=(queue->tear+1)%QUEUE_SIZE;return1;}intde_queue(Queue*queue,Item*item){if(queue->front==queue->tear){printf("%s\n","Thequeueisempty");return-1;}(*item)=queue->item[queue->front];queue->front=(queue->front+1)%QUEUE_SIZE;return1;}intdestroy_queue(Queue*queue){free(queue->item);}intmain(){Queueque;init_queue(&que);intelem;boolflag=true;while(flag){intchoice;printf("1foren_queue,2forde_queue,3forexit\r\npleaseinput:");scanf("%d",&choice);switch((choice)){caseEN_QUEUE:printf("inputanum:");scanf("%d",&elem);en_queue(&que,elem);break;caseDE_QUEUE:if(de_queue(&que,&elem)==1)printf("frontitemis:%d\n",elem);break;caseEXIT:flag=false;break;default:printf("errorinput\n");break;}}destroy_queue(&que);return0;}
队列满时:(rear+1)%maxSize= =front 不少一个存储位置时:加一个标志flag或者计数的count 入队时flag=true 出队时flag=false队满:rear= =front&flag队空:rear= =front&!flag 开始时count=0 入队时:...
少一个存储位置的
队列为空时:rear= =front
队列满时:(rear+1)%maxSize= =front
不少一个存储位置时:加一个标志flag或者计数的count
入队时flag=true
出队时flag=false
队满:rear= =front&flag
队空:rear= =front&!flag
开始时count=0
入队时:count++
出队是:count–
队满:rear ==front &&count=maxsize
队空:rear ==front&&count=0;