C语言 环形队列

这里写图片描述

队列 :队列是一种先进先出的数据结构。

比如说

排队买票,

有一个售票口,最多能排30人,那么最大存储空间就是30人,

每当有1个新人过来排队,就会站在队尾,这就叫入队,

每当有1个人买到票了,就会离开,就叫出队。

生活中,最前面1个人买完票后,队伍中剩下的每1个人都会向前走1位,

对于计算机来说,每个人动一下意味着要执行更多的代码,

如果卖票的人卖完第1个 ,第一个人就离开,

售票员就走向第2个,再走向第3个,

直到1队队伍尾走完,再进1队。售票员就重头开始走就会更方便。

========================================================

环形队列是这样的,不用每个人都向前移动1位,

在一个排满的队列中,当售票员卖了第1张票时,不要每个人向前移动。

因为1号位空出来了,下一个排队的人就站在1号位置上,队尾+1变成2,

售票员向前走了一步,再卖1张,

2号位置空出来了,下一个排队的人就到2号位置上,

队尾+1变成3,依次类推,

售票员卖到队伍尾部后又会重头开始来,依旧是按照1 2 3 的顺序,

就不需要执行更多的代码。

环形队列需要考虑以下内容:
1. 创建队列
(最大存储量,队列长度,队头下标,队尾下标,数组记录队伍每个下标的内容)
2. 删除队列,不需要的时候从内存中清除。
3. 队列为空判断,不能出队操作了。
4. 队列为满判断,不能入队操作了。
5. 遍历队列元素,验证队列内容是否按照要求来。

取余数就是为了,队伍再次从头开始排队。

代码就按照以上的需求进行建立

#define  MAXSIZE  5
#include <iostream>

// 队列包含的信息
typedef struct queue
{
    int *qu;      //用来存储全部的队列中的元素
    int head;     //队列头
    int tail;     //队尾
    int qlength;  //队列长度
    int maxsize;  //用来记录队列的最大容量

}QUEUE;

//  初始化队列
QUEUE  *CreateQueue ( int maxsize)
{
    printf("[%lu]",sizeof(QUEUE));
     QUEUE *q= (QUEUE *)malloc(sizeof(QUEUE));

    if (q == NULL) {
        printf("Memory alloc failure\n");
        exit(-1);
    }


    q->qu=(int *)malloc(sizeof(int)*maxsize);
    if(NULL==q->qu)
    {
        printf("Memory allocation failure");
        exit(-1);        //退出程序
    }
    //分配完空间后,1开始队头队尾都在一起,因为没人,都为0长度也为0,
    q->head = 0;
    q->tail = 0;
    q->qlength = 0;
    q->maxsize = maxsize;


    return q;
}

// 判断空队列,长度为0则为空
bool Empty (QUEUE *q)
{
   return  q->qlength == 0 ? true : false;
}

// 判断满队列,长度=最大容量为满
bool Full (QUEUE *q)
{
    return q->qlength == q->maxsize ? true : false;
}

//入队
bool Enqueue (QUEUE *q , int num)
{
    // 队列不满才插入
    if (Full(q)) {
        printf("队列满了,插入失败\n");
        return false;

    }else{
        //给队伍最尾添加赋值。
        q->qu[q->tail] = num;
        //队尾向后移动一位,如果超过最大值,则从0开始,变成队尾
        q->tail = (q->tail +1)%q->maxsize;
        //队伍长度+1
        q->qlength ++;
        return true;
    }

}
// 出队
bool Dequeue (QUEUE *q)
{
    // 队列有元素才能够删除
    if (Empty(q)) {
        printf("队列为空,删除失败\n");
        return false;
    }else{
        //队头向后移动一位 超过最大值又重新 从0 开始计算
        q->head = (q->head +1)%q->maxsize;
        // 队伍长度-1
        q->qlength -- ;

        return true;
    }
}

// 遍历队列元素
void Traverse(QUEUE *q)
{
    // 在队列长度范围内 打印队列从队列头 到队列尾的元素
    for (int i=0 ; i<q->qlength; i++) {
      printf("%d ",  q->qu[(q->head+i)%q->maxsize]);
    }
    printf("\n");
}



int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";


    QUEUE Q =*CreateQueue(MAXSIZE);
    if ( Empty(&Q)) {
        printf("空队列\n");
    };

    Enqueue(&Q, 10);

    Enqueue(&Q, 12);

    Enqueue(&Q, 14);
    if ( Empty(&Q)) {
        printf("空队列\n");
    };
    Enqueue(&Q, 16);

    Enqueue(&Q, 18);

    Dequeue(&Q);

    Enqueue(&Q, 20);

    if (Full(&Q)) {
        printf("满队列\n");
    }

    Traverse(&Q);


    return 0;
}

运行结果

Hello, World!
[24]空队列
满队列
12 14 16 18 20 
Program ended with exit code: 0
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要写一个 C 语言的环形队列,你需要先定义一个结构体来表示队列。这个结构体应该包含四个元素: 1. 一个数组用来存储队列中的元素 2. 一个指针用来指向队列的头部(即队列中第一个元素的位置) 3. 一个指针用来指向队列的尾部(即队列中最后一个元素的下一个位置) 4. 一个变量用来记录队列的大小 然后你就可以编写四个函数来实现环形队列的基本操作: 1. 初始化函数:用来初始化队列 2. 入队函数:用来向队列中添加元素 3. 出队函数:用来从队列中取出元素 4. 查询函数:用来查询队列的状态(比如是否为空,是否已满等) 下面是一个简单的 C 语言环形队列的例子: ``` #define QUEUE_SIZE 10 typedef struct { int data[QUEUE_SIZE]; // 数据存储数组 int head; // 头指针 int tail; // 尾指针 int size; // 当前队列中元素的数量 } Queue; // 初始化队列 void init(Queue *q) { q->head = 0; q->tail = 0; q->size = 0; } // 入队 void enqueue(Queue *q, int value) { if (q->size >= QUEUE_SIZE) { // 队 ### 回答2: 环形队列是一种数据结构,可以解决普通队列存满后无法再存入新元素的问题。C语言中实现环形队列的方法如下: 1. 首先,我们需要定义一个队列结构体,包含队列的大小、起始索引、结束索引和元素数组等字段。 ``` typedef struct { int size; // 队列的大小 int start; // 起始索引 int end; // 结束索引 int *values; // 元素数组 } CircularQueue; ``` 2. 编写初始化函数,用于创建一个新的环形队列。需要为队列结构体分配内存空间,并为元素数组分配大小为`size`的内存空间。 ``` CircularQueue* InitCircularQueue(int size) { CircularQueue *queue = (CircularQueue*)malloc(sizeof(CircularQueue)); queue->size = size; queue->start = -1; queue->end = -1; queue->values = (int*)malloc(size * sizeof(int)); return queue; } ``` 3. 实现入队操作,即向队列中添加元素。首先判断队列是否已满,若已满则不能添加新元素;否则,将`end`指针向前移动一个位置(循环移动),将新元素存入该位置。 ``` void Enqueue(CircularQueue *queue, int value) { if ((queue->end + 1) % queue->size == queue->start) { printf("队列已满,无法入队。\n"); return; } queue->end = (queue->end + 1) % queue->size; queue->values[queue->end] = value; if (queue->start == -1) { queue->start = queue->end; } } ``` 4. 实现出队操作,即从队列中移除元素。首先判断队列是否为空,若为空则不能移除元素;否则,移动`start`指针以移除当前位置的元素。 ``` int Dequeue(CircularQueue *queue) { if (queue->start == -1) { printf("队列为空,无法出队。\n"); return -1; } int value = queue->values[queue->start]; if (queue->start == queue->end) { queue->start = -1; queue->end = -1; } else { queue->start = (queue->start + 1) % queue->size; } return value; } ``` 5. 最后,实现其他必要的辅助函数,如判断队列是否为空、是否已满等。 通过以上步骤,我们可以成功实现一个在C语言中的环形队列。 ### 回答3: 环形队列是一种常用的数据结构,可以用来解决队列空间浪费问题。下面是一种实现环形队列的方法: 1. 首先,定义一个数组作为队列的底层数据结构,再定义两个指针front和rear,分别表示队列的头部和尾部。 2. 初始化队列时,将front和rear都设置为0,表示队列是空的。 3. 入队操作:当要入队一个元素时,先判断队列是否已满。如果队列已满,则提示队列已满,不能再入队;否则,将元素存入rear指针指向的位置,并将rear指针向后移动一位。若rear指针已经指向数组最后一位,则将rear指针置为0,实现循环。 4. 出队操作:当要出队一个元素时,先判断队列是否为空。如果队列为空,则提示队列为空,不能再出队;否则,将front指针指向的元素出队,并将front指针向后移动一位。若front指针已经指向数组最后一位,则将front指针置为0,实现循环。 5. 判断队列是否为空或已满:可以通过front和rear指针是否相等来判断队列是否为空,如果相等则为空;可以通过front指针与rear指针相差一位来判断队列是否已满,如果相差一位,则已满。 通过以上步骤,我们就可以实现一个基本的环形队列。在实际应用中,我们可以根据需要对队列进行扩展,添加其他操作,如获取队列长度、获取队首元素等。同时,考虑到线程安全问题,可以在入队和出队操作前加锁,以保证多线程环境下的安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值