首页 > 其他分享 >C语言之环形队列

C语言之环形队列

时间:2023-05-12 09:01:53浏览次数:37  
标签:return 队列 环形 C语言 int front obj

. 一、环形队列的优势

环形队列是一种特殊的队列,它可以解决普通队列在使用时空间利用不充分的问题。在环形队列中,当队列满时,队列的尾指针指向队列的起始位置,而不是指向队列的最后一个元素。这样可以在不浪费空间的情况下存储更多的元素。
      下面我们来详细讲解一下环形队列的实现。

. 二、环形队列的定义

首先,我们需要定义一个环形队列的结构体,包含以下成员变量:

  • int *queue:指向环形队列的指针;

  • int front:指向队列的头部;

  • int rear:指向队列的尾部;

  • int size:队列的容量。

typedef struct {
    int *queue;
    int front;
    int rear;
    int size;
} MyCircularQueue;

 三、环形队列的初始化

在初始化环形队列时,我们需要为其动态分配内存空间,并将头指针和尾指针都初始化为-1,表示队列为空。

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue *obj = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
    obj->queue = (int *)malloc(sizeof(int) * k);
    obj->front = -1;
    obj->rear = -1;
    obj->size = k;
    return obj;
}

. 四、环形队列的入队

当向队列中插入元素时,我们需要先判断队列是否已满。如果队列已满,则插入失败,返回false;否则,将元素插入到队列的尾部,并将尾指针指向下一个位置。
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if (myCircularQueueIsFull(obj)) {
        return false;
    }
    obj->rear = (obj->rear + 1) % obj->size;
    obj->queue[obj->rear] = value;
    if (obj->front == -1) {
        obj->front = obj->rear;
    }
    return true;
}

. 五、环形队列的出队

当从队列中删除元素时,我们需要先判断队列是否为空。如果队列为空,则删除失败,返回false;否则,将元素从队列的头部删除,并将头指针指向下一个位置。
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj)) {
        return false;
    }
    if (obj->front == obj->rear) {
        obj->front = -1;
        obj->rear = -1;
        return true;
    }
    obj->front = (obj->front + 1) % obj->size;
    return true;
}

. 六、环形队列的查看队首元素

当查看队列的头部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则返回队列头部的元素。
int myCircularQueueFront(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj)) {
        return -1;
    }
    return obj->queue[obj->front];
}

. 七、环形队列的查看队尾元素

当查看队列的尾部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则,返回队列尾部的元素。
int myCircularQueueRear(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj)) {
        return -1;
    }
    return obj->queue[obj->rear];
}

. 八、环形队列的判断是否为空

当判断队列是否为空时,只需要判断头指针是否为-1即可。
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front == -1;
}

. 九、环形队列的判断是否已满

当判断队列是否已满时,只需要判断尾指针下一个位置是否为头指针即可。
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->rear + 1) % obj->size == obj->front;
}

. 十、环形队列的销毁

当环形队列不再使用时,需要释放其占用的内存空间。
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->queue);
    free(obj);
}
总的来说,环形队列是一种非常实用的数据结构,特别适用于空间有限的情况下。通过合理的设计和实现,可以使得队列的空间利用率更高,并且操作效率也比较高。






标签:return,队列,环形,C语言,int,front,obj
From: https://www.cnblogs.com/rongjiangwei/p/17392767.html

相关文章

  • [每天例题]蓝桥杯 C语言 日期格式
    日期格式题目题目要求1.输出月份的前三个英文字母2.日期数字形式日期小于10时要补前导0思路分析1.这题的主要迷惑点在于月份的输出,我们输出月份的英文字母时,可以建立一个二维数组,注意,必须是二维数组,二维数组中第一个用来存放月份,第二个分别存放月份的三个字母。2.输......
  • [每天例题]蓝桥杯 C语言 密码发生器
    密码发生器题目 思路分析1.声明一个字符型二维数组,将输入的名字储存到数组里面2.定义一个整形数组存储密码3.将所有垂直在同一个位置的字符的ascii码值相加4.进行缩位处理 代码#include<stdio.h>intsuowei(intsum){inta,b;while(sum>=10){......
  • [每天例题]蓝桥杯 C语言 连续奇数和
    连续奇数和题目 思路分析1.采用双for,第一个for用于记录起始数字,第二个for计算和2.如果sum==111的立方,则输出起始数字,如果大于,则跳转到第一个for增大起始数字代码#include<stdio.h>intmain(){ longlongintn; n=111*111*111; inti,j; intsum=0; for(i=1;i<100......
  • [每天例题]蓝桥杯 C语言 时间加法
    时间加法题目思路分析满60进1,输出记得换行代码#include<stdio.h>intmain(){inta,b,t,m,n;scanf("%d%d%d",&a,&b,&t);b=b+t;while(b>=60){b-=60;a++;}printf("%d\n%d",a,b);retu......
  • (一) C语言基础
    目录数据类型基本数据类型派生数据类型结构型指针型数据类型基本数据类型整型:int占用4个字节,long占用8个字节字符型:char占用1个字节(即8位),一个汉字占用两个char浮点型:float占用4个字节,double占用8个字节派生数据类型结构型结构型就是用户自己制作的数据类型......
  • C语言刷leetcode——前缀和
    目录前缀和概述刷题560.和为K的子数组523.连续的子数组和974.和可被K整除的子数组前缀和概述https://zhuanlan.zhihu.com/p/436526162刷题560.和为K的子数组523.连续的子数组和974.和可被K整除的子数组......
  • [每天例题]蓝桥杯 C语言 不高兴的津津
    不高兴的津津题目  思路分析1.建立二维数组,分别存储周一到周日的日程安排2.可采用while循环或者for循环输入以及进行比对3.当a[i][j]+a[i][j+1]大于8时存储到max4.通过max大小判断输出最不高兴的一天,即max最大代码#include<stdio.h>intmain(){ inttime[7][2];......
  • ds:顺序表实现栈、队列的思想
      一、顺序表实现栈:1.入栈时需要判断栈满、出栈时需要判断栈空2.根据init()时s.top栈顶指针等于1、等于0的不同,在入栈、出栈时对于“元素操作、栈顶指针移动”的操作顺序也不同  二、顺序表实现队列:1.需要使用()%maxsize取模运算来将队列变成循环队列。队满:(Q.rear+1)......
  • C语言中.与->的区别
    (一)基础结构体用点,结构体指针用箭头。a->b 的含义是 (*a).b 。  现代的标准化的C语义上来说, -> 可以用 * 和 . 的组合实现。简单的说,就是一个快捷方式,一个语法糖。(二)例子在机器码和汇编的角度来看,不存在变量,不存在struct这种东西,只存在寄存器和一个叫做内存的......
  • 算法学习day13栈与队列part03-239、347
    packageLeetCode.StackAndQueuepart03;importjava.util.ArrayDeque;/***239.滑动窗口最大值*给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。*你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。*返回滑动......