c语言循环队列判断队列满了(对于循环队列无法判断队列是否为空)

循环队列的基本运算

循环队列是一种特殊的队列,在队列满的情况下,队列头指针和队列尾指针相等。在队列尾插入一个元素时,队列尾指针会向后移动。如果队列已满,队列尾指针会指向队列的起始位置。在队列头删除一个元素时,队列头指针会向后移动,如果队列已空,队列头指针会指向队列的起始位置。

循环队列的基本运算包括:

  • InitQueue( &Q ):初始化循环队列。
  • EnQueue( &Q, e ):将元素e插入队列尾部,如果队列已满则返回错误。
  • DeQueue( &Q, &e ):将队列头元素弹出到e中,如果队列为空则返回错误。
  • QueueEmpty( &Q ):判断队列是否为空。
  • QueueFull( &Q ):判断队列是否已满。
  • QueueLength( &Q ):获取队列长度。

判定循环队列是否已满

判断循环队列是否已满的方法有两种:一种是记录队列的长度,当队列长度等于队列最大长度时,队列即已满;另一种是使用标记指针,根据队尾指针是否等于队头指针,判断队列是否已满。

对于第一种方法,记录队列的长度并增加判断,会导致每次进行队列操作时都需要遍历队列,从而使队列的操作效率降低。

因此一般使用第二种方法。具体来说,当往队列中添加一个元素时,即令队尾指针指向下一个位置,并将元素赋值给该位置。如果队尾指针和队头指针指向同一个元素时,表示队列已满。

c语言循环队列判断队列满了(对于循环队列无法判断队列是否为空)

循环队列的相关代码实现

以下代码是一个基于数组实现的循环队列:

```c
#define MAX_QUEUE_SIZE 10
typedef struct {
int data[MAX_QUEUE_SIZE];
int front, rear;
}Queue;

//iMod:i对Max取模
int iMod(int i) {
return i % MAX_QUEUE_SIZE;
}

//初始化队列
void initQueue(Queue* Q) {
Q->front = Q->rear = 0;
}

//入队
bool enQueue(Queue* Q, int e) {
if (iMod(Q->rear + 1) == Q->front) { //队列已满
return false;
}
else {
Q->data[Q->rear] = e;
Q->rear = iMod(Q->rear + 1);
return true;
}
}

//出队
bool deQueue(Queue* Q, int* e) {
if (Q->front == Q->rear) { //队列已空
return false;
}
else {
*e = Q->data[Q->front];
Q->front = iMod(Q->front + 1);
return true;
}
}

//队列长度
int queueLength(Queue Q) {
return iMod(Q.rear - Q.front + MAX_QUEUE_SIZE);
}

//判断队列是否已满
bool queueFull(Queue Q) {
return (iMod(Q.rear + 1) == Q.front);
}

//判断队列是否为空
bool queueEmpty(Queue Q) {
return (Q.front == Q.rear);
}
```

在这个实现中,我们使用了MAX_QUEUE_SIZE常量来定义队列的容量大小。iMod函数根据取模运算来实现循环队列操作。初始化队列时,我们将队头和队尾设为0,即初始状态下队列为空。在入队时,首先判断队列是否已满。如果队列已满,则返回false,否则将元素插入队尾,并将队尾指针后移。在出队时,首先判断队列是否为空。如果队列为空,则返回false,否则弹出队头元素,并将队头指针后移。在实现中还提供了求队列长度、判断队列是否已满、判断队列是否为空的函数。

总之,循环队列的判断队列满了方法与实现,都比较简单,程序员可以根据具体的环境需求来选择合适的判断方式。对于队列的操作,记得要避免队列溢出和队列为空的问题。

本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/cpp0r2.html

郑重声明:

本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。

我们不承担任何技术及版权问题,且不对任何资源负法律责任。

如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。

如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

(0)
上一篇 2023年4月16日 下午6:30
下一篇 2023年4月16日 下午6:30

猜你喜欢