[ADT]CircularQueue_using_Array

        1)循环队列使用的数学原理:周期性。我们将:队列的长度 ⇔ 循环队列的周期,头位置%            周期 或 尾位置%周期 得倒该周期内的位置。“模运算将无限的整数域映射到有限的整数集合:          {0,1,2,......,b-1}上。运用取余运算将队尾指针从队头到队尾再到队头这样循环往复的变化。

        2)  空队条件:q->front == q->rear =

        3)满队条件:队列还剩余最后一个存储空间⇔队尾指针的下一个位置是队头。我们在初始队            列的时候,我们将front指标和rear指标指向同一个位置,同时我们也是通过这两个指标是否           指向同一个位置来判断队列是否为空的,如果将剩余的队空不保留填入元素,那么front 和             rear相等,这是空队的判断条件,显然是不能放在满队的条件里,所以我们只能改牺牲一个             存储单元。 队满条件:q->rear+1 == q->front;

        4)在新元素入队之前我们要检查队尾指标的后一个位置是否是队头,如果是则表示队满。            return false;表示插入失败

//循环链表中循环效果的实现,即首尾移动的周期性的体现:(q->rear + 1) % (q->size)
#include <stdio.h>
#include <stdlib.h>

typedef struct Queue
{
    int size;
    int front;
    int rear;
    int *Q;
}Queue;

void create(Queue *q,int size)
{
    q->size = size;
    q->front = q->rear = 0;//⚠️instead of: q->front = q->rear = -1;
    q->Q = (int*)malloc(sizeof(int)*q->size);
}

void enqueue(Queue *q,int x)
{
    if((q->rear + 1) % (q->size) == q->front) 
        printf("Queue is Full\n");
    else
    {
        q->rear = (q->rear +1) % (q->size);
        q->Q[q->rear] = x;
    }
}

int dequeue(Queue *q)
{
    int dequeue_data;

    if(q->front == q->rear)
        printf("Qieie is Empty\n");
    else
    {
        q->front = (q->front + 1) % (q->size);
        dequeue_data = q->Q[q->front];
        return dequeue_data;
    }
    return -1;
}

void Display(Queue q)
{
    int q_index = q.front + 1;
    do
    {
        printf("%d ",q.Q[q_index]);
        q_index = (q_index + 1) % q.size;
    } while (q_index != (q.rear + 1) % q.size);
    printf("\n");
}

int main()
{
    Queue q1;
    create(&q1,5);
    
    
    enqueue(&q1,10);
    enqueue(&q1,11);
    enqueue(&q1,12);
    enqueue(&q1,13);
    enqueue(&q1,14);
    Display(q1);
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值