当前位置: 首页 > 知识库问答 >
问题:

C语言中基于数组的队列逻辑

楚瑞
2023-03-14

我在Internet上阅读时碰巧遇到了一个基于数组的队列的实现:

#include <stdio.h>
#include <stdlib.h>

typedef int item_t;
typedef struct {item_t *base; 
                int    front; 
                int     rear; 
                int     size;} queue_t;

queue_t *create_queue(int size)
{   queue_t *qu;
    qu = (queue_t *) malloc( sizeof(queue_t) );
    qu->base = (item_t *) malloc( size * sizeof(item_t) );
    //printf("q->base address %p\n",qu->base);
    qu->size = size;
    qu->front = qu->rear = 0;
    return( qu );
}

int enqueue( item_t x, queue_t *qu)
{   
    printf("modulo result %d\n",((qu->rear +2)% qu->size));
    if ( qu->front != ((qu->rear +2)% qu->size) )
    {   qu->base[qu->rear] = x; 
        qu->rear = ((qu->rear+1)%qu->size);  
        return( 0 );
    }
    else
       return( -1 );
}

下面是代码中的create queue和enqueue逻辑。最初,front和Freal为零。qu->front和((qu->free+2)%qu->size)不相等,因此项目将被排队。我不明白为什么在这个逻辑中使用2-((qu->freed+2)%qu->size)

共有1个答案

燕经国
2023-03-14

因为如果使用(qu->rear+1)%qu->size,并且一个元素将在几乎满的队列中排队,那么q->brear将递增(这是在行“qu->brear=((qu->rear+1)%qu->size);”中完成的)您将得到这样一种情况,即满队列和空队列将无法区分。

假设队列大小为4个元素,然后添加4个实际元素,最终“front”将指向第0个元素(因为front从未更改),“frear”将再次指向第0个元素,因为“freal”增加了4次,在最后一次增加时它被包装回0。在本例中,front和Freal指向第0个元素,这与开始时队列为空时相同,您无法判断队列是满的还是空的,这是一个问题(有时)。

这段代码可以稍作更改,以反映这样一个事实:在设置队列时,队列大小参数并不意味着您创建了大小为N的队列,而是大小为n-1的队列....

 类似资料:
  • 数组是编程语言中用来存储元素的集合。在 C 语言中,集合是储存相同类型元素的集合。并且可以通过一个名称来来访。 -------------------------------------------- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | …… | N-1 | -------------------------------------------- 第一个元素

  • 数组是一种内存分配的形式,数组是定义了一个连续的空间,与指针类似。 数组定义方式 类型 数组名[数组大小];//类型为每个空间的大小,我们通过数组名和下标访问数据,数组名指向存储数据的首地址,但是我们不可以改变数组名指向的地址。数组大小只有在定义的时候生效,定义之后不可以被改变。 int a[100]; //申请了一个名叫a的数组,它包含了100个整型。 数组的访问 我们可以通过数组的下标访问数

  • 本文向大家介绍C语言实现循环队列,包括了C语言实现循环队列的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现循环队列的具体代码,供大家参考,具体内容如下 注意事项: 1、循环队列,是队列的顺序表示和实现。因为是尾进头出,所以和顺序栈不同的是需要将顺序队列臆造成一个环状的空间,以便在尾部添加满之后从头部空位开始插入。 2、也可以使用数组队列,也就是不能动态增长的顺序队列,这样不

  • 在之前的 C 语言标准中,逻辑运算符是表示两个数值之间逻辑关系的运算符。通常用 0 和 1 来表示假值和真值。但是在 C 语言中会认为非 0 的数值在逻辑运算中都为 1 。逻辑运算的返回值也是整数型,不是 0 就是 1 ,这点和其他很多编程语言是不同的。 但是,在 C99 标准中引入了布尔类型。所以 C 语言中的逻辑运算就简单了很多。要想使用布尔类型,需要引入 stdbool.h 这个库即可。但是

  • 有人知道为什么这个循环总是针对不同于1或0的值,以及如何避免在输入字符时出现无休止的循环吗? }

  • 主要内容:逻辑运算的结果,优先级现在假设有这样一种情况,我们的软件比较特殊,要求使用者必须成年,并且成绩大于等于60,该怎么办呢? 或许你会想到使用嵌套的 if 语句,类似下面这样的代码: 这种方法虽然能够行得通,但不够简洁和专业,我们可以将其压缩为一条 if else 语句: 是一个新的运算符,称为 逻辑运算符,表示 和 两个条件必须同时成立才能执行 if 后面的代码,否则就执行 else 后面的代码。 在高中数学中,我们就学