在循环队列里,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,不能通过条件front==rear来判别队列是"空"还是"满"。
解决这个问题的方法至少有两种:
1. 另设一布尔变量以区别队列的空和满;
2.另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度,所以可用的长度为n-1,这个要注意。
1)循环队列的数据结构
解决这个问题的方法至少有两种:
1. 另设一布尔变量以区别队列的空和满;
2.另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度,所以可用的长度为n-1,这个要注意。
1)循环队列的数据结构
typedef struct{
int *dat;
int front;
int rear;
}Queue;
2)创建循环队列
Queue *creat_queue()
{
Queue *q;
q=(Queue *)malloc(sizeof(Queue));
q->dat=(int *)malloc(MAX_QUEUE_SIZE * sizeof(int));
assert(NULL!=q->dat);
q->front=q->rear=0;
return q;
}
3)销毁队列
typedef struct{
int *dat;
int front;
int rear;
}Queue;
4)将数据压入队列
STATUS en_queue(Queue *q,int dat)
{
if((q->rear+1)%MAX_QUEUE_SIZE==q->front){
return FALSE;
}
q->dat[q->rear]=dat;
q->rear=(q->rear+1)%MAX_QUEUE_SIZE;
return TRUE;
}
5)将数据弹出队列
STATUS de_queue(Queue *q,int *value)
{
int tmp;
if(q->front==q->rear)//判断队列是否为空
return FALSE;
value=q->dat[q->front];
q->front=(q->front+1)%MAX_QUEUE_SIZE;
return TRUE;
}
6)获取队列长度
int get_length(Queue * q)
{
assert(NULL!=q);
return (q->rear-q->front+MAX_QUEUE_SIZE)%MAX_QUEUE_SIZE;
}