队列基础(循环队列)

1.队列的定义:

和栈相反,队列(queue)是一种先进先出(first in  first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素.

在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front).

2.循环队列的设计图示:

3.循环队列的结构设计:

typedef  struct  SqQueue
{
    int *base;//指向动态内存;
    int front;//队头指针,队头元素的下标
    int rear;//队尾指针,当前可以插入数据的下标(队尾后一个元素的下标)
    //int queuesize;//队列的总容量,要做到自动扩容就必须增加这个成员;
}SqQueue,*PSqQueue;

4.循环队列的实现

//初始化
void  InitQueue(PSqQueue pq)
{
    assert(pq != NULL);
    if (pq == NULL)
        return;

    pq->base = (int*)malloc(sizeof(int) * SIZE);
    assert(pq->base != NULL);

    pq->front = 0;
    pq->rear = 0;
}

static  bool IsFull(PSqQueue pq)
{
    return  (pq->rear + 1) % SIZE == pq->front;
    //return pq->rear + 1 == pq->front;//error,需要处理成环形;
}

//往队列中入数据(入队操作)
bool  Push(PSqQueue pq, int val)
{
    assert(pq != NULL);
    if (pq == NULL)
        return false;

    if (IsFull(pq))//如果队满则入队失败
    {
        return false;
    }
    pq->base[pq->rear] = val;
    //pq->rear++;//error,必须要处理成环形;
    pq->rear = (pq->rear + 1) % SIZE;
    return true;
}
//获取队头元素的值,但是不删除
bool  GetTop(PSqQueue pq, int* rtval)
{
    assert(pq != NULL);
    if (pq == NULL)
        return false;

    if (IsEmpty(pq))
    {
        return false;
    }
    *rtval = pq->base[pq->front];
    return true;
}
//获取队头元素的值,但是删除
bool   Pop(PSqQueue pq, int* rtval)
{
    assert(pq != NULL);
    if (pq == NULL)
        return false;

    if (IsEmpty(pq))
    {
        return false;
    }
    *rtval = pq->base[pq->front];
    //pq->front++;//error
    pq->front = (pq->front + 1) % SIZE;
    
    return true;
}
//判空
bool IsEmpty(PSqQueue pq)
{
    assert(pq != NULL);
    if (pq == NULL)
        return false;

    return  pq->front == pq->rear;
}
//获取队列中有效元素的个数
//重点,考点:公式
int  GetLength(PSqQueue pq)
{
    assert(pq != NULL);
    if (pq == NULL)
        return -1;

    return (pq->rear - pq->front + SIZE) % SIZE;
}
//清空所有的数据
void Clear(PSqQueue pq)
{
    pq->front = 0;
    pq->rear = 0;
}
//销毁
void Destroy(PSqQueue pq)
{
    assert(pq != NULL);
    if (pq == NULL)
        return;
    free(pq->base);
    pq->base = NULL;
    pq->front = 0;
    pq->rear = 0;
}

5.循环队列的总结

1)队列:先进先出的一种线性结构,入队(插入)的一端称为队尾,出队(删除)的一端称为队头
2)队列的存储方式有两种,一种为顺序结构(顺序队列),两一种为链式结构(链式队列)

3)顺序队列一定会设计成环形队列,原因是线性队列的入队为O(1),出队为O(n),而环形队列的入队为O(1),出队为O(1)
4)浪费一个空间不使用,主要是为了区分队空和队满的情况:空是队头和队尾相同,满是rear(队尾指针)再往后走一步为front(队头指针) (浪费一个空间)

5)队满的处理方式:1.固定长度,队满则入队失败(处理简单,不实用),采用1,和书本一致.2,长度不固定,队满则自动扩容(实现稍微复杂)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/204626.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电话销售如何提高成功率

电话销售是一种非常有效的销售方式,睡着通信技术,互联网的发展,现在电话销售已经成为一种重要的销售方式,很多行业和领域都有使用。 虽然最终目的都是为了将产品卖出去,但是对于电话销售来说,前期寻找客户…

MySQL进阶知识:锁

目录 前言 全局锁 表级锁 表锁 元数据锁(MDL) 意向锁 行级锁 行锁 行锁演示 间隙锁/临界锁 演示 前言 MySQL中的锁,按照锁的粒度分,分为以下三类 全局锁:锁定数据库中的所有表。表级锁:每次操…

11-@Transaction与AOP冲突解决

如题,最近碰到了一个问题,在public方法上添加Transaction没有生效,事务没有回滚。 我自己模拟了一个功能,向数据库表User里面插入用户数据。说一下代码背景, 数据库MySQL,持久化层Mybatis,项目使…

Linux系统编程 day07 信号

Linux系统编程 day07 信号 1. 信号的介绍以及信号的机制2. 信号相关函数2.1 signal2.2 kill2.3 abort和raise2.4 alarm2.5 setitimer 3. 信号集4. 信号捕捉函数6. SIGCHLD信号7. SIGUSR1与SIGUSR2 1. 信号的介绍以及信号的机制 信号是信息的载体,在Linux/Unix环境下…

行业追踪,2023-11-30

自动复盘 2023-11-30 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

企业数字化转型应对传统网络挑战的关键策略

数字化变革正在以前所未有的速度和规模改变着我们的生活和工作方式,使得传统网络架构面临着巨大的挑战。其中包括带宽需求增加、多云应用增加、安全威胁增加以及传统网络设备无法满足需求等问题。 数字化时代需要更高速、更可靠、更安全的网络支持,传统网…

C语言必备知识--函数返回局部变量

0.总结 1. 不能以局部变量的方式创建字符串数组的首地址 2.如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型 3.返回指向字符串常量的指针 4.数组不能作为函数返回值 5.在函数中可以返回局部变量的值,但是不能返回…

如何安装鸿蒙Harmony 4.0低版API9三方库

比如我要用下拉刷新三方库pulltorefresh 安装命令如下 ohpm install ohos/pulltorefresh 安装完后然后运行Demo报错,说没有isAtEnd方法 然后查看pulltorefresh 最新版2.0.4对应Harmony API10,然而我的手机是API9,所以必须找到API9的库,然后查看2.0.1是还是API9 所…

docker集群的详解以及超详细搭建

文章目录 一、问题引入1. 多容器位于同一主机2. 多容器位于不同主机 二、介绍三、特性四、概念1. 节点nodes2. 服务(service)和任务(task)3. 负载均衡 五、docker网络1. overlay网络 六、docker集群搭建1. 环境介绍2. 创建集群3. 集群网络4. 加入工作节点 七、部署可视化界面po…

建设中国版MBA在线教育网站,群硕为Quantic敲开中国大门

2024考研即将拉开序幕,一个令人胆寒的问题出现在问答社区热榜—— 从现实来看,学历贬值已经成为一种全球现象。在卷学历的也不仅是大学生,还有很多职场人士,渴望通过获得MBA学位成为精英人才、商业领袖。 Quantic是交互式MBA线上…

热部署怎么部署

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言操作流程:在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a832d83c091742eda9d9325931a89df4.png) 这里的跟上面的…

【自动化测试】pytest 用例执行中print日志实时输出

author: jwensh date: 20231130 pycharm 中 pytest 用例执行中 print 日志 standout 实时命令行输出 使用场景 在进行 websocket 接口进行测试的时候,希望有一个 case 是一直执行并接受接口返回的数据 def on_message(ws, message):message json.loads(message)…

Liunx配置Tomcat自启动

Liunx配置Tomcat自启动 Tomcat安装配置Tomcat开机启动 Tomcat安装 下载tomcat软件安装包,上传软件包到Liunx服务器。 解压软件包到opt目录下 tar -xvf apache-tomcat-9.0.76.tar.gz -c /opt配置Tomcat开机启动 (1)修改Tomcat bin目录下的ca…

有”亿“点强,抖音的服务器带宽是如何应对亿人同时刷屏的?

在当今这个“网络横行”的时代,刷短视频已然成为许多人日常生活的一部分。 当我们在刷短视频的时候,尽管家里的网速并不慢,但短视频播放的卡顿却让人难以忍受,有时候真的让人想扔掉手机。 那么,为什么会出现这种情况…

Elk+Filebeat+Kafka实现日志收集

ElkFilebeatKafka实现日志收集(本机nginx) 部署Zookeeper 1.实验组件 #准备3台服务器做Zookeeper集群 20.0.0.10 20.0.0.20 20.0.0.30 2.安装前准备 #关闭防火墙 systemctl stop firewalld systemctl disable firewalld setenforce 0#安装JDK yum install -y java-1.8.0-o…

【LeetCode】每日一题 2023_11_29 无限集中的最小数字(哈希/堆)

文章目录 刷题前唠嗑题目:无限集中的最小数字题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode?启动!!! 今天的题目也比较的简单,因为数据量不大,所以什么做法都能过的去 题目&a…

Ruoyi-Vue或者Ruoyi-Cloud登录进去之后的第一个页面如何修改(即如何去掉首页或者如何修改首页)

其实大家如果看过最近的码云上的issues 就能知道这个问题的答案了。 我这里给出一下链接:https://gitee.com/y_project/RuoYi-Vue/issues/I60JIY 开始 第一步,把router/index.js里面关于首页的路由给注释掉或者删除掉,如图: 第…

plt创建指定色系

1、创建不连续色系 import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap# 定义颜色的RGB值 colors [(0.2, 0.4, 0.6), # 蓝色(0.8, 0.1, 0.3), # 红色(0.5, 0.7, 0.2),(0.3,0.5,0.8)] # 绿色# 创建色系 cmap ListedColormap(colors)# 绘制…

化妆品大卖!年轻女孩26天狂赚7000万!

有个年轻的女孩,我们暂且称之为小美。小美经营着一个美丽的小程序商城,里面销售着各种各样的化妆品、日用百货和小家电。这些产品并非什么稀有品牌,但价格比其他地方要优惠一些,更重要的是,购买产品还能赚到钱。 让我们…

微信小程序 - 开发版、体验版、正式版共享本地缓存

问题描述 最近突然发现一个大问题啊,小程序切换版本环境的时候发现数据被污染了,瞬间就怀疑不同环境版本的小程序本地缓存是否共享的?! 果然是! 解决方案 我们可能马上想到解决方案就是:给每一个环境版本…