【追求卓越04】数据结构--栈与队列

news2024/11/18 15:42:05

引导

        今天我们开始学习栈与队列的内容,我觉得栈并不难,所以篇幅也就不会那么多了。在虚拟空间中,栈是用户空间中的一种数据结构,它主要用于保存局部变量。那么问题来了,为什么用栈来保存局部变量,不用别的数据结构呢?堆,数组,链表不可以吗

        我们知道栈的特点就是先进后出,后进先出。其实,我们可以这样定义,满足先进后出,后进先出操作特性的就是栈。因此栈没有固定的存储形式,比如数据是需要存储地址连续,链表存储地址可以不连续。栈可以用数组或链表都可以实现,只要它满足先进后出,后进先出操作特性即可。

        因此栈就是一个操作受限(只能从一端压栈,出栈)的线性表。

栈的复杂度

        栈的操作只有入栈和出栈,并且只涉及到栈顶的元素。所以它的复杂度都为O(1)。如图:

栈的应用

        特定的数据结构是对特定场景的抽象。那么有些问题用栈来处理肯定会比较方便。

栈在表达式中的使用

        在《程序语言设计基础》中有关于表达式知识点:比如一个3+5*8-6的表达式,你会怎么设计,让计算机去识别,计算呢?记得以前写过类似的程序,现在想想还有很多的优化空间。

        在表达式中,有中缀表达式,前缀表达式,后缀表达式3种。它们的分析方式也不相同。有兴趣的可以去了解一下我的另一篇文章【献给过去的自己】栈实现计算器(C语言)-CSDN博客。

栈在函数调用中的应用

        正如我们在开头引入的话题,为什么局部变量要保存在栈中?这里有几点需要解释:

  1. 局部变量保存在栈中,这个栈是内存中实际存在的栈,是真实的物理区。而我们全文所介绍的栈是一个数据结构,是抽象的。要区分开两个栈。
  2. 内存中的栈因为它的操作特性符合栈数据结构的特点,所以称为栈区。栈区主要存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。

那么我们为什么要将局部变量保存在栈区呢?

        其实我们并不是必须要使用栈结构,使用数组和链表也是可以的。可能稍微会麻烦点。函数之间调用,变化的主要是作用域及生命周期。

  • 当A函数进入B函数,就不能再访问A函数中的局部变量了。
  • B函数返回A函数之后,B函数中的局部变量就需要释放。

        针对作用域和生面周期变化的,我觉得栈可以很好的实现。进入一个函数时,在栈中记录入口(作用域界限),之后进行压栈操作,在该函数内部只能访问界限以内的数据。当退出函数时,将入口以内的数据直接释放。

队列

        队列和栈都是抽象的数据结构,是一个操作受限的线性表。它的特点就是先进先出(FIFO)。 它的操作又入队(将一个数据放到队尾)和出队(从队列头部取出一个数据)。和栈相似,如图:

顺序队列

        队列和栈一样,都能用数组和链表来实现。用数组实现就是顺序队列,用链表实现就是链式队列。我这里就简单用C语言实现一个顺序队列。

queue_len = 100
int queue[queue_len]={0};
head=0;
tail=0;
//
队空:head=tail;
//堆满:head=0 tail=queue_len;
bool enqueue (int item)
{
    if(tail == queue_len && head == 0)
        return false;
    if(tail == n)
    {
        int i = 0;
        for(i = 0 ; i < (tail - head) ; i++)
            queue[i] = queue[head+i];
        queue[tail-head] = item;
        tail = tail-head + 1;
        head=0;

    }
    else
    {
        queue[tail++] = item
    }

    return true;

}
int dequeue()
{
    if(head == tail)
        return false;
    return queue[head++];
}

该实现方式,出队和入队操作的复杂度都是O(1)。

循环队列

        在上面的队列中,当tail等于队列长度时,就需要进行数据搬移。循环队列就是省去了这个操作。循环队列的难点就在于如何确定队列满和队列空

  • 队列满:(tail+1 % queue) == head
  • 队列空:head=tail

堆满的判断方式会浪费数组中一个元素。故循环队列可按照下列实现:

queue_len = 100
int queue[queue_len]={0};
head=0;
tail=0;
//
队空:head==tail;
//堆满::(tail+1 % queue) == head;
bool enqueue (int item)
{
    if(((tail+1) % queue_len) == head)
        return false;
    queue[tail] = item;
    tail = (tail+1) % queue_len;
    return true;
}
int dequeue()
{
    if(head==tail)
        return false;
    int item = queue[head];
    head = (head+1)%queue_len
    return item;
}

队列的用途

        队列一般用于缓存操作。比如消息队列线程池等都是使用了队列。但是队列的大小设置是需要我们关注的。我个人主要的考虑依据是:在可接受的反应时间内,将队列设置到最大

总结

        本节主要介绍了栈数据结构,它具有先进后出,后进先出的操作特点。以及栈的在表达式和函数调用上的应用。一定要区别栈数据结构和内存中的栈不是完全相同的概念。算是交际关系.

        队列的概念,并实现了队列和循环队列。以及队列大小设置的依据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构(四)】前缀、中缀、后缀表达式(逆波兰表达式)和逆波兰计算器的代码实现(2)

文章目录 1. 前缀表达式(波兰表达式)1.1. 前缀表达式的计算机求值 2. 中缀表达式3. 后缀表达式(逆波兰表达式)3.1. 后缀表达式的计算机求值3.2. 逆波兰计算器的实现 4. 中缀表达式 转 后缀表达式4.1. 思路分析4.2. 代码实现 5. 逆波兰计算器的完整版 1. 前缀表达式(波兰表达式)…

如何搭建Zblog网站并通过内网穿透将个人博客发布到公网

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

紫光展锐V8821荣获“中国芯”重大创新突破产品奖

近日&#xff0c;“中国芯”优秀产品评选落下帷幕&#xff0c;紫光展锐首颗5G IoT-NTN卫星通信SoC芯片V8821凭借在卫星通信前沿领域的技术创新&#xff0c;从285家芯片企业、398款芯片产品中脱颖而出&#xff0c;荣获第十八届“中国芯”年度重大创新突破产品奖。 “中国芯”优…

SeaTunnel及SeaTunnel Web部署指南(小白版)

现在你能搜索到的SeaTunnel的安装。部署基本都有坑&#xff0c;官网的文档也是见到到相当于没有&#xff0c;基本很难找到一个适合新手小白第一次上手就能成功安装部署的版本&#xff0c;于是就有了这个部署指南的分享&#xff0c;小主已经把可能遇到的坑都填过了&#xff0c;希…

代码随想录算法训练营Day 60 || 84.柱状图中最大的矩形

84.柱状图中最大的矩形 力扣题目链接(opens new window) 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 1 < heights.length <10^50 < hei…

2014年12月10日 Go生态洞察:Go 1.4版本发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Vue弹窗的使用与传值

使用element-UI中的Dialog 对话框 vue组件结合实现~~~~ 定义html <div click"MyAnalyze()">我的区划</div><el-dialog title"" :visible.sync"dialogBiomeVisible"><NationalBiome :closeValue"TypeBiome" cl…

【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 6

1、明明买了一个扫地机器人&#xff0c;可以通过以下指令控制机器人运动: F:向前走 10 个单位长度 L:原地左转 90 度 R:原地右转 90 度 机器人初始方向向右&#xff0c;需要按顺序执行以下那条指令&#xff0c;才能打扫完下图中的道路 A、F-L-F-R-F-F-R-F-L-F B、F-R-F-L-F-F…

重磅!2023年两院院士增选名单公布

中国科学院 关于公布2023年中国科学院院士增选当选院士名单的公告 根据《中国科学院院士章程》《中国科学院院士增选工作实施办法&#xff08;试行&#xff09;》等规定&#xff0c;2023年中国科学院选举产生了59名中国科学院院士。 现予公布。 中国科学院 2023年11月22日…

YOLOv7独家改进: Inner-IoU基于辅助边框的IoU损失,高效结合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

💡💡💡本文独家改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,并与现有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )损失进行有效结合 推荐指数:5颗星 新颖指数:5颗星 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c …

运动型蓝牙耳机什么牌子好?运动蓝牙耳机品牌推荐

​在运动时&#xff0c;一款好的运动耳机不仅可以让你享受高质量的音乐&#xff0c;还可以提供舒适的佩戴体验和稳定的连接。今天我就来向大家推荐几款备受好评的运动耳机&#xff0c;它们都拥有出色的音质和耐用的设计&#xff0c;是你运动时的绝佳伴侣。 NO1&#xff1a;南卡…

【追求卓越09】算法--散列表(哈希表)

引导 通过前面几个章节的学习&#xff08;二分查找&#xff0c;跳表&#xff09;&#xff0c;我们发现想要快速查找某一个元素&#xff0c;首先需要将所有元素进行排序&#xff0c;再利用二分法思想进行查找&#xff0c;复杂度是O(logn)。有没有更快的查找方式呢&#xff1f; 本…

png,jpg图片透明度化demo

使用opencv对各种图片进行透明度化操作 1.如何配置opencv&#xff0c;相信大家已经会了&#xff0c;那直接跳到第2步&#xff0c;我给不会的同学们讲讲 1&#xff0c;下载opencv官方库文件&#xff0c;https://docs.opencv.org/ 我这里下载的是4.5.5版本。 2&#xff0c;在你…

实现el-input-number数字框带单位

实现的效果展示&#xff0c;可以是前缀单位&#xff0c;也可以是后缀单位。实现的思路就是动态修改伪元素 ::before 和 ::after 的 content值 实现二次封装数字框的代码如下&#xff1a; <template><el-input-numberref"inputNumber"v-model"inputVal…

一体化大气环境监测设备实时守护我们的空气质量

WX-CSQX12 随着空气污染问题的日益严重&#xff0c;大气环境监测设备成为了我们生活中不可或缺的一部分。而一体化的大气环境监测设备&#xff0c;更是为我们的环境保护工作带来了更多的便利和效益。 一体化大气环境监测设备是一种集成了多种功能于一体的环保设备&#xff0c;…

线上ES集群参数配置引起的业务异常案例分析

作者&#xff1a;vivo 互联网数据库团队- Liu Huang 本文介绍了一次排查Elasticsearch node_concurrent_recoveries 引发的性能问题的过程。 一、故障描述 1.1 故障现象 1. 业务反馈 业务部分读请求抛出请求超时的错误。 2. 故障定位信息获取 故障开始时间 19:30左右开始…

tp8 使用rabbitMQ

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且还要开启 php.ini中的 socket 扩展 php think make:command SimpleMQProduce //创建一个生产者命令行 php think make:command SimpleMQConsumer //创建一个消费者命令行 生产者代码 <?php declare (strict_ty…

2014年10月6日 Go生态洞察:Go在Google I/O和Gopher SummerFest的应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Oracle-客户端连接报错ORA-12545问题

问题背景: 用户在客户端服务器通过sqlplus通过scan ip登陆访问数据库时&#xff0c;偶尔会出现连接报错ORA-12545: Connect failed because target host or object does not exist的情况。 问题分析&#xff1a; 首先&#xff0c;登陆到连接有问题的客户端数据库上&#xff0c;…

redis-cluster集群模式

Redis-cluster集群 1 Redis3.0引入的分布式存储方案 2集群由多个node节点组成,redis数据分布在节点之中,在集群之中分为主节点和从节点3集群模式当中,主从一一对应,数据写入和读取与主从模式一样&#xff0c;主负责写&#xff0c;从只能读4集群模式自带哨兵模式&#xff0c;可…