循环队列的一些问题总结,入队、出队操作

在复习数据结构——队列这一节时遇到了一些问题,现总结如下,以便以后查阅:

  1. 在队列的顺序存储方式里,为了避免存储空间的“假溢出”,充分利用存储空间,我们用了一种实现方式,即循环队列。

来源于百度百科

(1). 图中有两个指针(只是两个整型变量,因为在这里有指示作用,所以理解为指针) front、rear,一个指示队头,一个指示队尾(这里注意:rear定义为指向队尾元素还是队尾元素的下一个空间)。

(2). rear和front互相追赶着,这个追赶过程就是队列添加和删除的过程,如果rear追到head说明队列满了,如果front追到rear说明队列为空。

如此一来,将出队的剩余的空间给予入队,满足了有限空间里的利用率要求。这些都是显而易见的。

  1. 第二点是由第一点那个rear指针发散的。实在是网上的博客资料太多,不同的书本里又说法不一。比如,老师上课说的是rear指针是指向队尾元素的,但我的一本书上却是指向队尾元素的下一个位置。我对照着写代码于是就出现了这样的问题:
  • 13
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
循环队列是一种队列,它可以在数组中循环使用空间,实现队列的基本操作包括初始化、入队出队。下面是使用顺序存储实现循环队列的初始化、入队出队操作的示例代码。 ```c #define MAXSIZE 100 // 循环队列的最大长度 typedef struct { int data[MAXSIZE]; // 数组存储元素 int front; // 队头指针 int rear; // 队尾指针 } Queue; // 初始化循环队列 void initQueue(Queue *q) { q->front = 0; q->rear = 0; } // 判断循环队列是否为空 int isEmpty(Queue *q) { return q->front == q->rear; } // 判断循环队列是否已满 int isFull(Queue *q) { return (q->rear + 1) % MAXSIZE == q->front; } // 入队操作 int enQueue(Queue *q, int element) { if (isFull(q)) { printf("Queue is full.\n"); return 0; } q->data[q->rear] = element; q->rear = (q->rear + 1) % MAXSIZE; return 1; } // 出队操作 int deQueue(Queue *q, int *element) { if (isEmpty(q)) { printf("Queue is empty.\n"); return 0; } *element = q->data[q->front]; q->front = (q->front + 1) % MAXSIZE; return 1; } ``` 上述代码中,循环队列使用数组存储元素,队头指针和队尾指针分别指向队头和队尾元素在数组中的位置。初始化操作将队头和队尾指针指向数组的第一个元素,判断队列是否为空的方法是队头指针和队尾指针是否相等,判断队列是否已满的方法是队尾指针加1后对数组长度取模是否等于队头指针。 入队操作将元素放入队尾指针指向的位置,然后将队尾指针加1,如果队尾指针超过了数组的长度,则将其置为0,实现循环使用空间的效果。如果队列已满,则返回0表示入队失败。 出队操作将队头指针所指向的元素取出,然后将队头指针加1,同样如果队头指针超过了数组的长度,则将其置为0,实现循环使用空间的效果。如果队列为空,则返回0表示出队失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值