/****************************************
循环队列操作:<ENQUEUE><DEQUEUE>
用数组Q[0,n-1]来实现一个至多有n-1个元素的队列。
队列的两个属性:head[Q] and tail[Q]
head[Q]指向队列的头
tail[Q]指向新元素将要被插入的地方。
队列中各个元素的位置为:head[Q],head[Q]+1,...,tail[Q]-1.
在最后一个位置要进行“环绕”,即队列中的n个元素排成环形,位置0接在位置n-1之后。
为了区分队列为空和队列为满时的状态,需要浪费一个元素的位置。
初始时,队列为空,有:head[Q]=tail[Q]=0;
队列满时,有:head[Q]=tail[Q]+1
出队入队伪代码如下:
ENQUEUE(Q,x)
if (tail[Q]+1)%length[Q] = head[Q]
then error "queue is full"
Q[tail[Q]] <—— x
tail[Q]=(tail[Q]+1)%length[Q]
DEQUEUE(Q)
if tail[Q]=head[Q]
then error "queue is empty"
x=Q[head[Q]]
head[Q]=(head[Q]+1)%length[Q]
return x
****************************************/
#include <stdio.h>
#include <stdlib.h>
#define QUEUESIZE 1024
#define MAX_INT ~(1<<31)
typedef struct {
int *data;
int head;
int tail;
int length;
}queue;
int enqueue(queue *q,int x)
{
//队列已满,返回-1表示插入失败
if( ((q->tail+1)%q->length) == q->head )
return -1;
q->data[q->tail]=x;
q->tail=(q->tail+1)%(q->length);
return 0;
}
int dequeue(queue *q)
{
//返回MAX_INT表示队列为空
if(q->head == q->tail)
return MAX_INT;
//先保存返回值
int rval=q->data[q->head];
q->head=(q->head+1)%(q->length);
return rval;
}
//初始化一个size大小的循环队列
queue* init_queue(int size)
{
queue *q=(queue*)malloc(sizeof(queue));
q->data=(int*)malloc(size*sizeof(int));
q->head=0;
q->tail=0;
q->length=size;
return q;
}
//释放队列资源
void fini_queue(queue *q)
{
if(q->data)
free(q->data);
if(q)
free(q);
}
int main()
{
queue *q=init_queue(QUEUESIZE);
int i;
for(i=0;i<10;++i)
enqueue(q,i);
printf("%d ",dequeue(q));
printf("%d ",dequeue(q));
printf("%d ",dequeue(q));
fini_queue(q);
}
(八)循环队列
最新推荐文章于 2024-03-03 22:21:16 发布