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

引导

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

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

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

栈的复杂度

        栈的操作只有入栈和出栈,并且只涉及到栈顶的元素。所以它的复杂度都为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.mzph.cn/news/161078.shtml

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

相关文章

Go 语言函数、参数和返回值详解

函数是一组语句&#xff0c;可以在程序中重复使用。函数不会在页面加载时自动执行。函数将通过调用函数来执行。 创建函数 要创建&#xff08;通常称为声明&#xff09;一个函数&#xff0c;请执行以下操作&#xff1a; 使用 func 关键字。指定函数的名称&#xff0c;后跟括…

10年开发工程师总结,8大主流程序员兼职平台,月入30k不是梦!

今年互联网行业陆续裁员减薪&#xff0c;许多人怨声载道的同时也开始另谋出路。而对于程序员更是应该提早做好准备&#xff0c;活跃在兼职接单的最前沿。 我们程序员是一门技术工种&#xff0c;与互联网其他行业相比薪水会相对高一点&#xff0c;不过钱也不是那么好赚的&#…

2023年【广东省安全员B证第四批(项目负责人)】报名考试及广东省安全员B证第四批(项目负责人)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批&#xff08;项目负责人&#xff09;报名考试是安全生产模拟考试一点通总题库中生成的一套广东省安全员B证第四批&#xff08;项目负责人&#xff09;复审考试&#xff0c;安全生产模拟考试一点…

java:springboot单元测试spring-boot-starter-test

背景 Java的单元测试可以使用多个框架&#xff0c;其中比较流行的包括&#xff1a; JUnit&#xff1a;JUnit是Java单元测试最常用的框架&#xff0c;它提供了一套丰富的API&#xff0c;可以方便地编写测试用例和测试套件。JUnit 5是JUnit的最新版本&#xff0c;引入了许多新功…

各大电商平台双十一“狂飙”,如何选择商城系统?

今年是“双十一”的第十五年。作为各大平台和品牌的全年最重要的营销节点&#xff0c;品牌们可谓是来势汹汹&#xff0c;各种促销活动和优惠力度让人眼花缭乱。 淘天数据显示&#xff0c;天猫促销活动开售当晚&#xff0c;155个品牌开卖成交额突破1亿元&#xff1b;首小时内7.1…

str转wstr的三种方法和从网站获取json数据到数据随机提取,返回拼接字符串和动态数组

库的设置 hv库 外部包含目录&#xff1a;…\include\libhv_new\hv; 库目录&#xff1a;…\include\libhv_new\lib\x86\Release; 附加依赖项&#xff1a;hv.lib; //Get请求 获取json数据&#xff0c;然后提取符合 条件的&#xff0c;time值大于自定义变量的值&#xff0c;然后取…

【UE】用样条线实现测距功能(上)

目录 效果 步骤 一、创建样条网格体组件3D模型 二、实现点击连线功能 三、实现显示两点间距离功能 效果 步骤 一、创建样条网格体组件3D模型 创建一个圆柱模型&#xff0c;这里底面半径设置为10mm&#xff0c;高度设置为1000mm 注意该模型的坐标轴在如下位置&#xff1…

基于pytest的服务端http请求的自动化测试框架?

1、引言 我有一个朋友是做 Python 自动化测试的。前几天他告诉我去参加一个大厂面试被刷了。 我问他是有没有总结被刷下来的原因。他说面试官问了一些 pytest 单元测试框架相关的知识&#xff0c;包括什么插件系统和用力筛选。但是他所在的公司用的技术是基于 unittest 的&am…

Win10系统无法登录Xbox live的四种解决方法

在Win10系统中&#xff0c;用户可以登录Xbox live平台&#xff0c;畅玩自己喜欢的游戏。但是&#xff0c;有用户却遇到了无法登录Xbox live的问题。接下来小编给大家详细介绍四种简单的解决方法&#xff0c;解决后用户在Win10电脑上就能成功登录上Xbox live平台。 Win10系统无法…

Linux编程 文件操作 creat open

文件描述符 文件描述符在形式上是一个非负整数。实际上&#xff0c;它是一个索引值&#xff0c;指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时&#xff0c;内核向进程返回一个文件描述符。 启动一个进程之后&#xff0c;…

SquareCTF-2023 Web Writeups

官方wp&#xff1a;CTFtime.org / Square CTF 2023 tasks and writeups sandbox Description&#xff1a; I “made” “a” “python” “sandbox” “”“” nc 184.72.87.9 8008 先nc连上看看&#xff0c;只允许一个单词&#xff0c;空格之后的直接无效了。 flag就在当…

inux应用开发基础知识——串口应用编程(十一)

前言&#xff1a; 在Linux系统中&#xff0c;串口设备以文件的形式存在&#xff0c;通常位于/dev目录下&#xff0c;如ttyS0、ttyUSB0等。这些设备文件可以用于读取和写入数据。要使用串口设备&#xff0c;需要打开相应的设备文件。在打开串口时&#xff0c;可以使用O_RDWR选项…

哈夫曼树你需要了解一下

哈夫曼树介绍哈夫曼数特点哈夫曼应用场景哈夫曼构建过程哈夫曼树示例拓展 哈夫曼树介绍 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种特殊的二叉树&#xff0c;也被称为最优二叉树。在计算机科学中&#xff0c;它是由权值作为叶子节点构造出来的一种二叉树。哈夫曼树的…

05 取样器(BeanShell和JSR223 Sampler)

一、取样器作用 1、取样器可以理解为Jmeter的桥梁&#xff0c;或者是Jmeter的加工厂&#xff1b; 2、Jmeter使用过程中&#xff0c;经常有些数据不能直接使用&#xff0c;需要加工后才能使用&#xff1b;这样就用到了取样器&#xff1b;但是这里存在问题&#xff0c;Jmeter中的…

Differences between package.json and pnpm-lock.yaml

1.pnpm-lock.yaml 是pnpm包管理工具生成的确保依赖包的版本在所有的环境里面都相同对依赖包的任何操作都会更新在该文件中&#xff0c;因此&#xff0c;需要确保提交到代码仓库中。包含了解析的依赖项和版本号。如下图&#xff1a; 2.package.json 列出应用所需的依赖和元数…

【黑马甄选离线数仓day01_项目介绍与环境准备】

1. 行业背景 1.1 电商发展历史 电商1.0: 初创阶段20世纪90年代&#xff0c;电商行业刚刚兴起&#xff0c;主要以B2C模式为主&#xff0c;如亚马逊、eBay等 ​ 电商2.0: 发展阶段21世纪初&#xff0c;电商行业进入了快速发展阶段&#xff0c;出现了淘宝、京东等大型电商平台&a…

(swjtu西南交大)数据库实验(数据库需求分析):音乐软件数据管理系统

实验内容&#xff1a; 数据库需求分析&#xff1a;各用户组需求描述&#xff0c;绘出数据流图&#xff08;详细案例参见教材p333~p337&#xff0c;陶宏才&#xff0c;数据库原理及设计&#xff0c;第三版&#xff09;&#xff1b; 一、选题背景 近年来&#xff0c;“听歌”逐…

Ajax入门-Express框架介绍和基本使用

电脑实在忒垃圾了&#xff0c;出现问题耗费了至少一刻钟time&#xff0c;然后才搞出来正常的效果&#xff1b; 效果镇楼 另外重新安装了VScode软件&#xff0c;原来的老是报错&#xff0c;bug。。&#xff1b; 2个必要的安装命令&#xff1b; 然后建立必要的文件夹和文件&…

新能源车将突破2000万辆,汉威科技为电池安全保驾护航

近年来&#xff0c;我国新能源汽车销量持续突破新高。据中汽协数据&#xff0c;1~10月&#xff0c;国内新能源汽车销量达728万辆&#xff0c;同比增长37.8%&#xff0c;市场占有率达到30.4%。随着第四季度车市传统旺季的到来&#xff0c;新能源消费需求将进一步释放&#xff0c…

Python小灰灰

系列文章 序号文章目录直达链接表白系列1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心htt…