Circular Queue--循环队列

本文探讨了循环队列的概念,它使用循环数组来实现队列操作。由于在循环队列中,`rear == front`可能表示队列为空或已满,文章列举了两种处理这种情况的策略:1. 使用标识位区分队列状态;2. 少用一个元素空间作为满队列的标志。并分别给出了两种策略的代码示例。

       队列大家见得很多了,形式也比较简单,就是一个特化的链表,它的enqueue、dequeue操作相当于链表的addLast、removeFirst操作。关于链表的实现,可以查看我的另一篇博文--"LinkedList--链表"。下面仅讨论一个稍微复杂点的情况--循环队列。

       循环队列的就是用循环数组来实现队列,有一个问题需要解决:在普通的非循环队列中,rear == front 说明队列为空队列,然而在循环队列中,这个可能意味着队列为空,也可能意味着队列为满。通常采用两种策略来处理这个问题。


1. 设置一个标识位,以区别队列是空还是满。可以这样认为:初始化的时候令 front = rear = 0,flag = 0代表空。通过enqueue 入队操作使得 front = rear,认为到达满状态,flag = 1;通过dequeue 出队操作使得 front = rear,认为到达空状态,flag = 0。


2. 少用一个元素空间,

#include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 // 自定义数据类型 typedef struct { char *str; int num; float fl; } datatype; // 循环队列结构体 typedef struct { datatype data[MAX_SIZE]; int front; int rear; } CircularQueue; // 初始化循环队列 void initQueue(CircularQueue *queue) { queue->front = 0; queue->rear = 0; } // 判断队列是否为空 int isEmpty(CircularQueue *queue) { return queue->rear == queue->front; } // 判断队列是否已满 int isFull(CircularQueue *queue) { return (queue->rear + 1) % MAX_SIZE == queue->front; } // 入队操作 int enqueue(CircularQueue *queue, datatype item) { if (isFull(queue)) { printf("队列已满,无法入队!\n"); return 0; } queue->data[queue->rear] = item; queue->rear = (queue->rear + 1) % MAX_SIZE; return 1; } // 出队操作 int dequeue(CircularQueue *queue, datatype *item) { if (isEmpty(queue)) { printf("队列已空,无法出队!\n"); return 0; } *item = queue->data[queue->front]; queue->front = (queue->front + 1) % MAX_SIZE; return 1; } // 打印队列元素 void printQueue(CircularQueue *queue) { if (isEmpty(queue)) { printf("队列已空!\n"); return; } int i = queue->front; while (i != queue->rear) { printf("str: %s, num: %d, fl: %.2f\n", queue->data[i].str, queue->data[i].num, queue->data[i].fl); i = (i + 1) % MAX_SIZE; } } int main() { CircularQueue queue; initQueue(&queue); datatype item1 = {"hello", 10, 3.14}; datatype item2 = {"world", 20, 6.28}; enqueue(&queue, item1); enqueue(&queue, item2); printQueue(&queue); datatype dequeuedItem; if (dequeue(&queue, &dequeuedItem)) { printf("出队元素: str: %s, num: %d, fl: %.2f\n", dequeuedItem.str, dequeuedItem.num, dequeuedItem.fl); } printQueue(&queue); return 0; } 此代码的算法思路
最新发布
11-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值