数组实现环形队列-获取有效数据个数

数组实现环形队列-获取有效数据个数

(rear-front+maxSize)%maxSize

rear队尾元素下标的下一个
front队头元素的下标
maxSize队列的最大长度

拆解一下,
如果 队尾指针队头指针 后面的时候
队尾指向的数组下标队头指向的数组下标 之后,

在这里插入图片描述
size = rear - front 即 6-3=3

如果 队尾指针队头指针 前面的时候
队尾指向的数组下标队头指向的数组下标 之前,
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201212171337450.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NzgzMzQy,size_16,color_FFFFFF,t_70**size = rear + maxSize - front** ,
size = rear-1 + maxSize - (front-1) 即 rear + maxSize - front

这个用数学的方式进行理解
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

int size; //有效队列长度
if(rear>front){ 
	size = rear - front;
} else{
	size = rear + maxSize - front
}

如果把这个分段函数写成一个函数的时候,
size = (rear-front+maxSize)%maxSize

%maxSize防止size大于maxSize
+maxSize防止结果为负数
  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是一个基于C语言的环形队列算法实现: ``` #include <stdio.h> #include <stdlib.h> #define QUEUE_SIZE 5 typedef struct { int *arr; // 队列数据存储数组 int front; // 队首指针 int rear; // 队尾指针 int size; // 队列元素个数 } CircularQueue; // 初始化队列 void initQueue(CircularQueue *q) { q->arr = (int*)malloc(QUEUE_SIZE * sizeof(int)); q->front = 0; q->rear = 0; q->size = 0; } // 判断队列是否为空 int isEmpty(CircularQueue *q) { return q->size == 0; } // 判断队列是否已满 int isFull(CircularQueue *q) { return q->size == QUEUE_SIZE; } // 入队 void enqueue(CircularQueue *q, int val) { if (isFull(q)) { printf("Queue is full. Enqueue failed.\n"); return; } q->arr[q->rear] = val; q->rear = (q->rear + 1) % QUEUE_SIZE; q->size++; } // 出队 int dequeue(CircularQueue *q) { if (isEmpty(q)) { printf("Queue is empty. Dequeue failed.\n"); return -1; } int val = q->arr[q->front]; q->front = (q->front + 1) % QUEUE_SIZE; q->size--; return val; } // 获取队列长度 int getSize(CircularQueue *q) { return q->size; } // 打印队列元素 void printQueue(CircularQueue *q) { if (isEmpty(q)) { printf("Queue is empty. No element to print.\n"); return; } printf("Queue elements: "); for (int i = q->front; i != q->rear; i = (i + 1) % QUEUE_SIZE) { printf("%d ", q->arr[i]); } printf("\n"); } int main() { CircularQueue q; initQueue(&q); enqueue(&q, 1); enqueue(&q, 2); enqueue(&q, 3); enqueue(&q, 4); enqueue(&q, 5); printQueue(&q); dequeue(&q); dequeue(&q); printQueue(&q); enqueue(&q, 6); enqueue(&q, 7); printQueue(&q); return 0; } ``` 这个实现中,定义了一个`CircularQueue`结构体表示环形队列。在初始化队列时,动态分配一个数组来存储队列元素,并将队首、队尾指针和队列元素个数初始化为0。入队时,先判断队列是否已满,如果已满则提示失败;否则将新元素插入队尾,并将队尾指针向后移动一个位置(如果到达数组末尾则回到数组头),同时队列元素个数加1。出队时,先判断队列是否为空,如果为空则提示失败;否则取出队首元素,将队
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值