int queue_is_full(Queue *queue) { return ((queue->tail + 1) % queue->size) == (queue->head % queue->size); } 如何将头指针和尾指针对队列长度取模,以防止指针越界。
时间: 2024-03-10 10:45:16 浏览: 49
在进行指针操作时,需要对队列长度取模,以确保指针不会越界。具体来说,假设队列长度为N,当队列的头指针或尾指针超过N-1时,需要对其进行取模操作,将其限制在0至N-1之间。这可以通过使用取模运算符%来实现。例如,如果要获取头指针对长度N取模后的结果,可以使用以下代码:
```
queue->head % queue->size
```
这样可以保证头指针始终在0至N-1之间,不会越界。同样的,对于尾指针,也可以使用相同的方法进行取模操作。
相关问题
int queue_is_full(Queue *queue) { return ((queue->tail + 1) % queue->size) == queue->head; } int queue_is_empty(Queue *queue) { return queue->tail == queue->head; } int queue_enqueue(Queue *queue, uint8_t item) { if (!queue_is_full(queue)) { queue->data[queue->tail++] = item; queue->tail %= queue->size; return 1; } else { uart_disable(); return 0; } } int queue_dequeue(Queue *queue, uint8_t *item) { if (!queue_is_empty(queue)) { *item = queue->data[queue->head++]; queue->head %= queue->size; return 1; } else { return 0; } }
这是一个基于循环数组实现的队列。其中,queue_is_full函数用于判断队列是否已满,如果队列的尾指针加1对队列的长度取余等于头指针,即队列满了;queue_is_empty函数用于判断队列是否为空,如果队列的头指针等于尾指针,即队列为空。queue_enqueue函数用于向队列中加入元素,它首先判断队列是否已满,如果未满,则将元素添加到队列的尾部,并将尾指针向后移动一个位置,最后对尾指针取模以实现循环队列的效果。如果队列已满,则禁用串口并返回0。queue_dequeue函数用于从队列中取出元素,它首先判断队列是否为空,如果非空,则将队列头部的元素赋值给指针item,并将头指针向后移动一个位置,最后对头指针取模以实现循环队列的效果。如果队列为空,则返回0。
int queue_init(Queue *queue) {//initial const uint32_t size = 2; queue->data = (uint8_t*)malloc(sizeof(uint8_t) * size); queue->head = 0; queue->tail = 0; queue->size = size; // If malloc returns NULL (0) the allocation has failed. return queue->data != 0; } /*int queue_is_full(Queue *queue) { return ((queue->tail + 1) % queue->size) == queue->head; }*/ int queue_is_full(Queue *queue) { return ((queue->tail + 1) % queue->size) == (queue->head % queue->size); } int queue_is_empty(Queue *queue) { return queue->tail == queue->head; } int queue_enqueue(Queue *queue, uint8_t item) { if (!queue_is_full(queue)) { queue->data[queue->tail++] = item; queue->tail %= queue->size; return 1; } else { uart_disable(); return 0; } } int queue_dequeue(Queue *queue, uint8_t *item) { if (!queue_is_empty(queue)) { *item = queue->data[queue->head++]; queue->head %= queue->size; return 1; } else { return 0; } }
这段代码是一个简单的队列实现,定义了一个结构体 Queue,包含队列数据、队首、队尾和队列大小等信息。其中,queue_init 函数用于队列初始化,queue_is_full 和 queue_is_empty 函数用于判断队列是否已满或已空,queue_enqueue 和 queue_dequeue 函数用于元素入队和出队操作。值得注意的是,queue_is_full 函数中的计算方式使用了取模运算,避免了队列溢出的问题。另外,在队列已满的情况下,queue_enqueue 函数会禁用串口输出并返回 0,表示入队失败。
阅读全文