循环队列

一般的数组进行出队和入队,front和rear只能增加不能减,会让内存浪费,所以要搞一个循环队列,当到达最后一个时候,我们让它的下标又为0,循环下去。

#include<stdio.h>
#include<malloc.h>
typedef struct Queue
{
    int *arr;
    int front;//队头
    int rear;//最后一个有效元素下一个
}QUEUE;
void init(QUEUE *pq)
{
    pq->arr=(int*)malloc (sizeof(int)*5);
    pq->front=pq->rear=0;
}

bool isfull(QUEUE *pq)
{
    if((pq->rear+1)%5==pq->front)//如果有n个元素,我们只存放n-1个元素如果rear和front相挨,并且rear+1对数组长度取余等于front说明满了,
    {
        return true;
    }
    else{
    return false;
    }
}
bool enqueue(QUEUE*pq,int val)
{
    if(isfull(pq))
    {
        return false;
    }
    else
    {
           pq->arr[pq->rear]=val;//把值赋给数组下标为rear
    pq->rear=(pq->rear+1)%5;//rear加一,因为是循环队列,所以采用rear+1对数组长度取余来计算
    return true;
    }
}
bool isempty(QUEUE*pq)
{
    if(pq->front==pq->rear)//front==rear说明为空
    {
        return true;
    }
    else{
    return false;
    }
}
bool dequeue(QUEUE*pq,int *val)
{
    if(isempty(pq))
    {
        return false;
    }else
    {
        *val=pq->arr[pq->front];//把要出队的元素用临时变量保存起来
pq->front=(pq->front+1)%5;//front加一对数组长度取余
return true;
    }
}
void print(QUEUE*pq)
{
    while(pq->front!=pq->rear)//队头不等于最后一个有效元素下一个
    {
     printf("%d\n",pq->arr[pq->front]);//打印值
         pq->front=(pq->front+1)%5;//front加一对数组长度取余
    }
}
int main(void)
{
    int val;
    QUEUE q;
    init(&q);
    enqueue(&q,1);
    enqueue(&q,2);
    enqueue(&q,3);
    enqueue(&q,8);
    if(dequeue(&q,&val))
   {
       printf("出队成功元素是%d\n",val);
   }
   else
   {
       printf("出队失败");
   }
  print(&q);
    return 0;
}

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值