队列之循环队列

循环队列

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时需要再%数组长度
上一篇:[转载] python中 堆heapq以及 队列queue的使用


下一篇:703. 数据流中的第 K 大元素