循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。
解决这一问题有两种方法
1.设置计数器判断
2.队满时:(rear+1)%n==front,n为队列长度(所用数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。N模运算得出的结果 永远在0~N-1之间,原来 如果你的队列可以储存的数据跟数组长度相同时 无法解决头尾指针相等时,对队列空满的判断,当尾指针数组的最后一位也就是Q[N-1]上时(假设头指针未动),此时条件可以判断队列已经满了。尾指针的值仍是N-1 头指针的值是0 ,队列正好是满的,不会对队列空的判断产生影响。 为什么存储N-1个数?提供了一个数组坐标,可以把尾指针扔在那,不将尾指针重置到0处。
这里分别给出两种方法的C语言实现
1.设置计数器判断
#define N 6
#include <stdio.h>
#include <stdlib.h>
int Q[N];
int q_tail=0;
int q_head=0;
int count=0;
void enqueue(int Q[],int x);
int dequeue(int Q[]);
void enqueue(int Q[],int x)
{
Q[q_tail]=x;
q_tail=(q_tail+1)%N;
count++;
if(count==N)
{
printf("queue is full\n");
}
}
int dequeue(int Q[])
{
int x;
x=Q[q_head];
q_head=(q_head+1)%N;
count--;
if(count==0)
{
printf("queue is empty\n");
}
return x;
}
2.队列长度比数组长度少1的模运算判断
#define N 6
#include <stdio.h>
#include <stdlib.h>
int Q[N];
int q_tail=0;
int q_head=0;
int count=0;
void enqueue(int Q[],int x);
int dequeue(int Q[]);
void enqueue(int Q[],int x)
{
if(q_head==(q_tail+1)%N)
{
printf("queue is FULL");
return ;
}
Q[q_tail]=x;
q_tail=(q_tail+1)%N;
}
int dequeue(int Q[])
{
int x;
if(q_tail==q_head)
{
printf("queue is empty");
return ;
}
x=Q[q_tail];
q_tail=(q_tail+1)%N;
return x;
}
转载请注明出处!2016.1.25