循环队列
typedef struct queue//用数组创建的队列
{
int *pbase;
int front;
int rear;
}QUEUE;
int main()
{
QUEUE Q;
init(&Q);
en_queue(&Q,1);
en_queue(&Q,2);
en_queue(&Q,3);
en_queue(&Q,4);
en_queue(&Q,5);
en_queue(&Q,6);
}
void init(QUEUE *pq)
{
pq->pbase=(int *)malloc(sizeof(int)*6);
pq->front=0;
pq->rear=0;
}
bool is_full(QUEUE *pq)
{
if((pq->rear+1)%6==pq->front)//循环队列中队列为空时rear是表面上的最后一个,front是表面上的第一个,而在创建时就设立rear的位置永远为
//空,与队列为空时rear等于front加以区分。队列为满时rear的后一个是front,rear处为空;队列为空时rear=front,rear处为空,front也就为空
return true;
else return false;
}
bool en_queue(QUEUE*pq,int val)//入队时先将元素放在rear处,在将rear++
{
if(is_full(pq))
{
return false;
}
else{
pq->pbase[pq->rear++]=val;
pq->rear=(pq->rear+1)%6;
return true;
}
}
void show(QUEUE*pq)
{
int i=pq->front;
while(pq->rear!=i)
{
printf("%d",pq->pbase[i]);
i=(i+1)%6;
}
}
bool is_empty(QUEUE*pq)
{
if(pq->front==pq->rear)
return true;
else return false;
}
bool out_queue(QUEUE*pq,int *pval)
{
if(is_empty(pq))
{
return false;
}
else{
*pval=pq->pbase[pq->front];
pq->front=(pq->front+1)%6;
}
}
总结
- 队列的rear始终为空,队列为空时rear=front;队列为满时,rear的下一个是front
- 因为是循环队列,因此在+1时需要再%数组长度