数据结构 第三章 栈和队列(栈)

news2024/10/7 4:24:53

天空之外:点击收听

1 基本知识点

1、栈顶是指允许进行插入和删除操作的一端,另外一端称为栈底
2、进栈是指在栈顶位置插入元素(也叫入栈或者压栈),出栈是指删除栈顶元素(也叫弹栈或者退栈)
3、栈溢出是指:

当栈满的时候,若再进行入栈就会发生上溢
当栈空的时候,若再进行出栈就会发生下溢

4、空栈是指不含有元素的空表
5、栈的实现方法:

顺序栈和链栈

6、顺序栈:使用数组的后端表示栈顶,top常被使用为栈顶指针

栈为空时,栈顶指针:top == -1
进行入栈操作时,需要先去让栈顶指针加一,再去放入元素
进行出栈操作时,需要先去取出栈顶元素,再去让栈顶指针减一

7、链栈:因为栈的基本操作都是在栈顶进行的,所以说使用不带头结点的单链表就可以实现:

需要考虑栈顶元素的插入和删除操作
将单链表的头指针指向栈顶,当栈顶指针top为空的时候表示为空栈

8、入栈操作:
入栈

p->data = value;
p->next = top;
top = p;
//p成为新的栈顶元素

9、出栈操作:
出栈

p = top;
value = p->data;
top = top->next;
free(p);//删除栈顶元素
return value;//返回栈顶元素的值

10、栈是操作受限的线性表


2 栈的应用

1、中缀表达式求值

假定表达式中只有运算符和操作数两类成分,运算符有(+、-、*、/)和圆括号()

设置两个栈来求解
运算符栈(OperatorStack)SY
操作数栈(OperandStack)SC
算法

首先将SC置为空,将表达式起始符‘=’压入SY中作为栈底元素,然后依次扫描中缀表达式:
1 如果是数字,那么就压入SC中
2 如果是运算符,那么:
	2.1若当前的运算符的优先级高于SY的栈顶的运算符,那么就继续入栈
	2.2若当前的运算符的优先级低于SY的栈顶的运算符,那么就弹出SY的栈顶的运算符,再从SC中弹出两个操作数,进行相对应运算之后,将结果压入SC栈中

优先级
1、乘除大于加减
2、等号优先级最低
运算符之间的优先关系

2、将中缀表达式转换为后缀表达式(运算符出现在操作数的后面)

算法

设置一个字符栈和两个字符数组
1 将中缀表达式放在字符数组infix中
2 将后缀表达式放在字符数组postfix中
3 从左到右开始扫描字符数组infix
	3.1如果遇到‘(’,那么就压入栈中
	3.2如果遇到操作数,那么就直接送入postfix中
	3.3如果遇到运算符并且该运算符的级别高于栈顶元素,那么就入栈;否则,栈顶元素就退栈,进入postfix中,infix再去和新的栈顶元素比较,重复3.3
	3.4如果遇到‘)’,那么就将栈中的元素依次送入postfix中,直到碰到‘(’,消掉一对括号为止
	3.5如果遇到‘=’时候,那么就开始执行退栈操作,然后将退栈的元素依次存入postfix中,直到栈为空
	3.6最后在postfix中存入‘\0’作为后缀表达式的结束标志

小技巧
1、添加小括号
2、移动运算符
3、删除小括号
中缀表达式转换为后缀表达式
同时这个方法也可以将中缀表达式转换为前缀表达式

3、后缀表达式求值

算法

1、设置一个操作数栈opnd
2、从左到右扫描后缀表达式,直到遇到结束标志‘\0’
	2.1如果读到的是操作数,那么就将其进行入栈
	2.2如果读到的是运算符,那么就将栈顶的两个操作数出栈,后弹出的操作数为被操作数,先弹出的为操作数,将得到的操作数完成运算符所规定的运算,然后将结果入栈
	2.3如果读到空格就跳过
3、表达式扫描完成之后,栈中就剩下一个数为表达式的值

4、栈与递归

1、汉诺塔问题

经典三步走:(假设有A、B、C三个柱子)
1、(n-1) A->C->B
//将n-1个盘子由A经过C移动到B
2、n A->C
//将第n个盘子由A移动到C
3、(n-1) B->A->C
//将n-1个盘子由B经过A移动到C

n个盘子最少移动次数:2^n-1


3 题目练习

题目练习

n-i+1

题目练习

top[1]+1=top[2]

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

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

相关文章

led和白炽灯哪个对眼睛好?分享光线舒适的LED护眼灯

最近对于白炽灯与LED灯哪个更护眼的话题受到很多人关注,经过综合考虑,LED灯更适合家庭使用的。 LED灯是电致发光的半导体芯片,抗震性能好,内置三基色荧光粉,让光线更加柔和,做到使用寿命长达10万小时&#…

通信原理简明教程 | 基本概念

文章目录1 通信及通信系统1.1 通信系统的基本组成模型1.2 通信系统的分类1.3 模拟通信和数字通信系统2 调制和解调2.1 调制解调的基本概念2.2 调制解调的分类2.3 调制解调的作用3 通信系统的质量指标3.1 模拟通信系统的质量指标3.2 数字通信系统的质量指标4 总结1 通信及通信系…

算法导论(二):渐进符号、递归及解法

渐近符号 基本的渐近符号&#xff1a; O 表示上界&#xff0c;即小于等于 ≤ Ω 表示下界&#xff0c;即大于等于 ≥ Θ 表示渐近等于 &#xff08;上一集也有使用这个符号&#xff09; 还有几个严格符号&#xff1a; o 表示小于 < ω 表示大于 > 渐近符号O 主要详细讲…

Latex中给图表添加中英文标题及生成相关目录

通常我们都是用\caption{这里是标题}的方式给图表添加对应的标题&#xff0c;如果我们需要同时给出两个标题呢&#xff1f;&#xff08;例如某些毕业论文中要求同时给出中英文标题&#xff09;如果我们还要生成对应的图表目录呢&#xff1f;这些问题都可以利用bicaption这个包来…

【论文翻译】A simple yet effective baseline for 3d human pose estimation

【论文】https://arxiv.org/abs/1705.03098v2 【pytorch】weigq/3d_pose_baseline_pytorch: A simple baseline for 3d human pose estimation in PyTorch. (github.com) 【tensorflow】https://github.com/una-dinosauria/3d-pose-baseline 摘要 随着深度卷积网络的成功&am…

手把手教你如何在项目中使用阿里字体图标IconFont

阿里图标官网地址&#xff1a;IconFont-阿里巴巴矢量图标库 一、注册账号 要使用阿里图标&#xff0c;首先你要在它的官网注册一个账号&#xff0c;注册的方式有多种&#xff08;手机号&#xff0c;Github&#xff0c;微博&#xff0c;阿里域账号&#xff09;&#xff0c;根据…

【CSDN的2022与2023】普普通通的三年,从懵懂、焦虑到坚定、奋进,破除焦虑努力成为更好的自己

大家好&#xff0c;我是黄小黄&#xff01;一名普通的软件工程在读学生。最近终于闲下来了一丢丢&#xff01;借着休息之余&#xff0c;来写一篇年度总结散散心~与其说是年度总结&#xff0c;不如说是给大学生活与莽莽撞撞的自己一个交代叭&#xff01; 这些都是小标题~碎碎念1…

行为型模式-观察者模式

1.概述 定义&#xff1a;又被称为发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时&#xff0c;会通知所有的观察者对象&#xff0c;使他们能…

深度卷积对抗神经网络 基础 第四部分 可控制的GANs(Controllable GANs)

不同的生成模型定义 深度卷积对抗神经网络包含两种不同的生成模型&#xff0c; 条件生成模型 和非条件生成模型。非条件生成模型就像是一个彩票机或者赌博机&#xff0c;你输入一个任意数字的硬币数量&#xff0c;而输出则是随机的彩球。这样的系统&#xff0c;我们不能控制输…

第九层(3):STL之vector类

文章目录前情回顾vrctor类vrctor类的功能vector与普通数组的区别vector的迭代器vector类内的构造函数vector类内的赋值操作vector类内对容器和大小操作vector类内的插入操作vector类内的删除操作vector类内的单个访问vector类内的交换函数vector类内的预留空间下一座石碑&#…

goto语句——“C”

各位CSDN的uu你们好啊&#xff0c;好久不见&#xff0c;甚是想念。今天小雅兰要带大家学习的内容是一个小知识点——goto语句&#xff0c;好啦&#xff0c;就让我们进入goto语句的世界吧 C语言中提供了可以随意滥用的goto语句和标记跳转的标号。 从理论上 goto语句是没有必要…

Python爬虫教你爬取视频内容

前面介绍了基本的数据爬取&#xff0c;图片爬取的相关案例前面文章也有涉及&#xff0c;关于有些案例网站不能登录的问题&#xff0c;可以再找些别的网站&#xff0c;因为道理既然明白了&#xff0c;其实什么网站都一样&#xff0c;它有反爬机制&#xff0c;自然有应对它的办法…

安装mysql 5.7.24

官网 https://downloads.mysql.com/archives/community/ 安装 安装好后解压有如下内容 配置电脑环境变量 MYSQL_HOME mysql安装目录 PATH %MYSQL_HOME%\bin 配置mysql相关信息 &#xff08;1&#xff09;新建配置文件my.ini 配置的是字符集类信息与存储引擎相关信息 &…

(Java高级教程)第四章必备前端基础知识-第二节2:CSS属性

文章目录一&#xff1a;CSS属性一览表二&#xff1a;常用属性详解&#xff08;1&#xff09;字体属性&#xff08;2&#xff09;文本属性&#xff08;3&#xff09;背景属性一&#xff1a;CSS属性一览表 W3C&#xff1a;元素属性 A&#xff1a; align-content规定弹性容器内…

[Android开发练习1] 绘制国旗

前言 本题主要在于熟练使用线性布局&#xff0c;了解其布局特点学会横向与纵向排列控件&#xff0c;以及认识TextView控件&#xff0c;同时学会使用对控件赋予不同的权重值来布局&#xff0c;在布局中使用了权重的控件的宽度就要设置成0dp。另外&#xff0c;了解到如何应对xml代…

Linux常见命令 25 - RPM包安装、升级、卸载、查询、校验、提取

目录 1. 包名与包全名 2. RPM安装 3. RPM包升级 4. RPM包卸载 5. 查询是否安装RPM包 6. RPM包校验 7. RPM包中文件提取 1. 包名与包全名 包全名&#xff1a;操作的包是没有安装的软件包时&#xff0c;使用包全名&#xff0c;而且要注意路径包名&#xff1a;操作已经安…

【进击的算法】基础算法——怎么优雅地控制边界范围

学习范围 &#xff1a; ✔️数组 ✔️边界控制本文作者 &#xff1a; 蓝色学者i 边界控制的艺术前言一、为什么需要控制边界&#xff1f;二、怎么优雅地控制边界&#xff1f;三、令人抓狂的二分查找3.1 题目概述3.2解题思路3.3 解决方案方案一&#xff1a;边界都有效方案二&…

Python3 循环语句

本章节将为大家介绍 Python 循环语句的使用。 Python 中的循环语句有 for 和 while。 Python 循环语句的控制结构图如下所示&#xff1a; while 循环 Python 中 while 语句的一般形式&#xff1a; while 判断条件(condition)&#xff1a;执行语句(statements)…… 执行流程…

【数据结构之二叉树系列】万字深剖普通二叉树的遍历+分治算法思想

目录前言一、背景知识二、前序遍历三、中序遍历四、后序遍历五、求二叉树中结点的个数1. 遍历计数&#xff08;1&#xff09;前序遍历计数&#xff08;2&#xff09;中序遍历计数&#xff08;3&#xff09;后序遍历计数2.分治算法思想&#xff08;推荐&#xff09;敬请期待前言…

Java基础 IO

IO流 IO流 什么是IO流&#xff1f; 存储和读取数据的解决方案 I&#xff1a;input O&#xff1a;output 流&#xff1a;像水流一样传输数据 IO流的作用&#xff1f; 用于读写数据&#xff08;本地文件&#xff0c;网络&#xff09; IO流按照流向可以分类哪两种流&#xff1f…