-
【大话数据结构C语言】14 栈的应用 - 四则运算达式求值
2020-11-15 20:40:29我们都知道四则运算是很简单,尤其还可以使用计算器,不过对于涉及算式中带有大中小括号的四则运算,这时候简单的计算器就不好用了 比如: 这里边的困难在于乘除在加减的后面,却要先运算,加了括号就变得更复杂了 ...系列文章参考资料为《大话数据结构》,源码为个人私有,未经允许不得转载
技术交流群或资料添加微信号:CoderAllen,回复关键字即可主要用后缀(逆波兰)表达式做栈的现实
0.前言
我们都知道四则运算是很简单,尤其还可以使用计算器,不过对于涉及算式中带有大中小括号的四则运算,这时候简单的计算器就不好用了
比如:
这里边的困难在于乘除在加减的后面,却要先运算,加了括号就变得更复杂了原理:
不过仔细观察的话,这里边括号都是成对出现的,所以可以利用栈来实现,只要碰到左括号,就将此左括号进栈,不管表达式有多少重括号,反正遇到左括号就进栈,而后面的出现右括号的时候,就让栈顶的左括号出栈,期间让数字运算,这样,最好有括号的表达式从左到右巡查一遍,栈应该是由空到有元素,最后在因全部匹配成功后成为空栈的结果但是对于四则运算,括号也只是其中的一部分,先乘除后加减使得问题依然复杂,这时候就引出了逆波兰表达式 - 一种不需要括号的后缀表达法
要用后缀表达式应该是
叫后缀的原因是所有的符号都是要在运算数字的后边出现1.如何获得后缀表达式
我们平时的标准四则远算表达式,叫做中缀表达式
下边就看下
规则:
从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;
若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级低于栈顶符号,则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止1.初始化一个空栈,用来对符号进行出栈使用
2.利用栈计算后缀表达式
下边看看计算式是如何计算逆波兰表达式的
1.初始化空栈
2.后缀表达式中前三都是数字,所以 9 3 1 进栈
3.下边的“-”,所以栈中的1 出栈做减数,3出栈做被减数,运算得到2,再把2进栈
4.接着是3进栈
5.后边的乘号“*”,就是栈中的3和2出栈相乘,得到6,在进栈
6.下边的“+”,则6和9出栈相加得到15,在把15进栈
7.然后是10和2两个数字进栈
8.再然后是符号“/”,栈顶的2和10出栈相除得到5,然后5进栈
9.最后一个符号“+”,所以15和5出栈相加,得到20在入栈
10.结果是20出栈,栈变空
从上述推导可以发现,要想计算机具有处理我们通常的标准(中缀)表达式的能力,最重要的就是两步
1.将中缀表达式转化为后缀表达式(栈用来进出运算的符号)
2.将后缀表达式进行运算得出结果(栈用来进出运算的数字)整个过程都充分利用了栈的先进后出的特性,可以非常好的理解栈这个数据结构
-
21天学通C++ (中文第五版)
2010-06-23 16:57:03无论读者是刚开始学习编程还是已经有一些编程经验,书中精心安排的内容都将让你的C++学习变得既快速又轻松。 本书约定 提示:提供使读者进行C++编程时更高效、更有效的信息。注意:提供与读者阅读的内容相关的... -
整理后java开发全套达内学习笔记(含练习)
2011-06-06 14:29:30进行高精度运算可以用java.math包中BigDecimal类中的方法。 自动类型提升又称作隐式类型转换。 强制类型转换:int ti; (byte) ti ; 强制转换,丢弃高位 宣告变量名称的同时,加上“final”关键词来限定,这个... -
Python之元组
2019-11-03 23:57:29元组 tuple 列表数与可变序列,可以任意修改列表中的元素。 元组数与不可变序列,不能修改元组中的元素。 因此,元组没有增加元素、修改元素...通过()创建元组,小括号可以省略 如果只有一个元素,则必须后面加逗...
元组 tuple
-
列表数是可变序列,可以任意修改列表中的元素。
-
元组数是不可变序列,不能修改元组中的元素。
-
因此,元组没有增加元素、修改元素、删除元素相关的方法。
-
只需要元组的创建和删除,元组中元素的访问和计数即可。
-
元组支持操作:
1,索引访问
2,切片操作
3,连接操作
4,成员关系操作
5,比较运算操作
6,计数
元组的创建
通过
()
创建元组,小括号可以省略- 如果只有一个元素,则必须后面加逗号。
>>> a = (1,2,3) >>> type(a) <class 'tuple'> >>> a = 1,2,3 >>> type(a) <class 'tuple'> >>>
通过
tuple()
创建元组tuple
(可迭代的对象)tuple()
可以接收列表、字符串、其他序列类型、迭代器等生成元组。list()
可以接受元组、字符串、其他序列类型、迭代器等生成列表。
>>> a = tuple() >>> a () >>> a = tuple("abcd") >>> a ('a', 'b', 'c', 'd') >>> a = tuple(range(3)) >>> a (0, 1, 2) >>>
zip
- 将多个列表对应位置的元素组合成元组,并返回元组对象
>>> a = [1,2,3] >>> b = [4,5,6] >>> c = [7,8,9] >>> d = zip(a,b,c) >>> d <zip object at 0x000001AB3B2763C0> >>> list(d) [(1, 4, 7), (2, 5, 8), (3, 6, 9)] >>>
生成器推导式创建元组
- 从形式上看,生成器推导式和列表推导式类似,只是生成器推导式使用小括号。
- 生成器推导式生成的不是元组,是一个生成器对象。
>>> a = (x*2 for x in range(4)) >>> a <generator object <genexpr> at 0x000001AB3B277F90> >>> tuple(a) (0, 2, 4, 6) >>> tuple(a) () >>>
- 只能访问一次生成器对象,第二次就为空了。
>>> a = (x*2 for x in range(4)) >>> a.__next__() 0 >>> a.__next__ () 2 >>> a.__next__ () 4 >>>
元组的元素访问和计数
- 元组的元素不能修改
>>> a = (1,2,3,4,5) >>> a[0] 1 >>> a [0] = 6 Traceback (most recent call last): File "<pyshell#76>", line 1, in <module> a [0] = 6 TypeError: 'tuple' object does not support item assignment >>>
- 元组的元素访问和列表一样,只不过返回的仍是元组对象
- 列表关于排序的方法
list.sorted()
时修改原列表对象,元组没有该方法。 - 如果要对元组排序,只能使用内置函数
sorted(tupleObj)
,并生成新的对象。
>>> a = (1,2,3,4) >>> sorted(a) [1, 2, 3, 4] >>>
元组总结
- 元组的核心特点:不可变序列。
- 元组的访问和处理速度比列表快。
- 与整数和字符串一样,元组元素可以作为字典的键,列表永远不能作为字典的键使用。
-
-
Python打卡七——元组
2020-11-11 22:02:03Python打卡(七) 元组讲解 (1)概述 列表属于可变序列,可以任意修改列表中的元素。...1、通过()创建元组,小括号可以省略。 a = (10,20,30) 或者 a = 10,20,30 如果元组中只有一个元素,则必须后面加Python打卡(七)
元组讲解
(1)概述
列表属于可变序列,可以任意修改列表中的元素。元组tuple属于不可变序列,不能修改元组中的元素。因此,元组没有增加元素、删除元素、修改元素相关方法。
元组支持以下几种操作:
索引访问、切片操作、连接操作、成员关系操作、比较运算操作、计数(元组长度len、最大值max、最小值min、求和sum等)。(2)元组的创建
1、通过()创建元组,小括号可以省略。
a = (10,20,30) 或者 a = 10,20,30
如果元组中只有一个元素,则必须后面加括号。这是因为解释器会把(1)解释为整数1,而将(1,)解释为元组。
例如:>>>a = (1) >>>type(a) <class = 'int'> >>>a = (1,) #或者a = 1, >>>type(a) <class = 'tuple'>
2、通过tuple()创建元组
tuple(可迭代的对象)
例如:>>>b = tuple() #创建一个空元组对象 >>>b () >>>b = tuple("abc") >>>b ('a','b','c') >>>b = tuple(range(3)) >>>b (0,1,2) >>>b = tuple([2,3,4]) >>>b (2,3,4)
总结:
tuple()可以接收列表、字符串、其他序列类型、迭代器等生成元组。
list()可以接收元组、字符串、其他序列类型、迭代器等生成列表。(3)元组对象的删除
del b则元组对象b就被删除了
(4)元组的访问计数等
1、元组元素不能修改,即a为元组且a = (20,10,30,9,8),则a[3] = 33是无法编译通过的。
2、元组的元素访问和列表一样,只不过返回的仍然是元组对象。#元组的访问方式 >>>a = (20,10,30,9,8) >>>a[1] 10 >>>a[1:3] (10.30) >>>a[:4] (20,10,30,9)
3、元组中关于排序的方法只能使用内置函数sorted(tupleObj),并生成新的列表对象。注意是生成新的列表对象。
>>>b = (30,20,40) >>>sorted(b) [20,30,40]
4、元组的拼接,采用“+”号,生成一个新的元组对象。
>>>a = 10,20 >>>b = 30,40 >>>a+b (10,20,30,40) >>>a (10,20)
5、len()操作、sum()操作、max()操作、min()操作
>>>a = 10,20 >>>len(a) 2 >>>sum(a) 30 >>>max(a) 20 >>>min(a) 10
6、zip可以将多个列表对应位置的元素组合成为元组,并返回这个zip对象。
>>>a = [10,20,30] >>>b = [40,50,60] >>>c = [70,80,90] >>>d = zip(a,b,c) >>>d <zip object at 0x0015CCDB> >>>list(d) [(10,40,70),(20,50,80),(30,60,90)]
(5)生成器推导式创建元组
从形式上看,生成器推导式与列表推导式类似,只是生成器推导式使用小括号。列表推导式直接生成列表对象,生成器推导式生成的不是列表也不是元组,而是一个生成器对象。我们可以通过生成器对象,转化成列表或者元组。也可以使用生成器对象的__next__()方法进行遍历,或者直接作为迭代器对象来使用。不管什么方式使用,元素访问结束后,如果需要重新访问其中的元素,必须重新创建该生成器对象。
生成器的使用测试:>>>s = (x*2 for x in range(5)) >>>s <generator object <genexpr> at 0x0000000002BDEB48> >>>tuple(s) (0,2,4,6,8) >>>list(s) #只能访问一次元素,第二次就为空了。需要在生成一次 [] >>>s <generator object <genexpr> at 0x0000000002BDEB48> >>>tuple(s) () >>>s = (x*2 for x in range(5)) >>>s.__next__() 0 >>>s.__next__() 2 >>>s.__next__() 4
总结:
1)元组的核心特点是:不可变序列
2)元组的访问和处理速度比列表快
3)与整数和字符串一样,元组可以作为字典的键,列表则永远不能作为字典的键使用(因为整数、字符串和元组都是不可变的) -
python序列——元组
2020-09-09 18:35:45列表属于可变序列,可任意修改列表中的元素,而元组属于不可变序列,不能改变元组中的元素...通过()创建元组,小括号可省略 如:a=(10,20,30)或者a=10,20,30 注:如果元组只有一个元素,则后面必须加逗号,因为解释器会列表属于可变序列,可任意修改列表中的元素,而元组属于不可变序列,不能改变元组中的元素,因此没有增删改元素的相关的方法
只需学习元组的创建和删除,元组中元素的访问和计数即可元组支持:
索引访问:用[]和列表一样
切片操作(slice)
连接操作(+)
成员关系操作(in)
比较运算操作
计数:元组长度len(),max(),min(),sum()等一.元组的创建
- 通过()创建元组,小括号可省略
如:a=(10,20,30)或者a=10,20,30
注:如果元组只有一个元素,则后面必须加逗号,因为解释器会把(1)解释为整数,而把(1,)解释为元组 - 通过tuple(可迭代的对象)创建元组
a=tuple()创建空元组
a=tuple(range(3))转成元组
a=tuple(‘abc’)转成元组
a=tuple([2,3,4])转成元组
二.元组的访问
三.元组排序
四.zip
zip(列表 1,列表 2,…)将多个列表对应位置的元素组合成为元组,并返回这个 zip 对象。
a = [10,20,30]
b = [40,50,60]
c = [70,80,90]
d = zip(a,b,c)
list(d)
[(10, 40, 70), (20, 50, 80), (30, 60, 90)] - 通过()创建元组,小括号可省略
-
C语言程序设计标准教程
2009-05-22 18:29:14在程序执行过程中,其值不发生改变的量称为常量,取值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,... -
C语言编程魔法书:基于C11标准.陈轶(带书签文字版).pdf
2018-04-21 16:20:20同时在后会分别介绍GCC编译器与Clang编译器的C语言语法扩展。通过阅读本书,读者能够完全掌握新标准的C语言编程。并且对C语言设计思想、实现方式也能有个大概的了解。 前言 第一篇 预备知识篇 第1章 C魔法概览 /2 ... -
《Java开发实战1200例(第I卷)》(李钟尉.陈丹丹).part2 高清完整PDF版
2016-06-13 15:53:27实例064 字符串大小写转换 实例065 字符与Unicode码的转换 4.2 辨别字符串 实例066 判断用户名是否正确 实例067 用户名排序 实例068 判断网页请求与FTP请求 实例069 判断文件类型 实例070 判断字符串是否为... -
《Java开发实战1200例(第I卷)》(李钟尉.陈丹丹).part3 高清完整PDF版
2016-06-13 16:11:24实例064 字符串大小写转换 实例065 字符与Unicode码的转换 4.2 辨别字符串 实例066 判断用户名是否正确 实例067 用户名排序 实例068 判断网页请求与FTP请求 实例069 判断文件类型 实例070 判断字符串是否为... -
Java代码实例
2016-06-21 22:44:511.2.3 安装后Java目录的解读 7 1.3 学会使用API 7 1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 ... -
硕士生,博士生论文排版技巧方法
2009-05-03 16:37:22参考文献标注要求用中括号把编号括起来,至今我也没找到让Word自动加中括号的方法,需要手动添加中括号。 在文档中需要多次引用同一文献时,在第一次引用此文献时需要制作尾注,再次引用此文献时点“插入︱交叉引用... -
Java SE 6.0编程指南 源码
2012-05-18 13:40:451.2.3 安装后Java目录的解读 7 1.3 学会使用API 7 1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 ... -
《C#经典编程220例》.(明日科技).【带书签】-共3部分
2016-08-02 17:04:42实例017 使用小括号括起来的表达式 23 .实例018 使用算术运算符开发简单计算器 23 实例019 使用条件运算符判断指定年份是不是闰年 26 实例020 使用typeof关键字获取类的内部结构 28 实例021 巧用位移运算符获取汉字... -
尹成Python27天入门到项目实战
2020-12-05 17:04:22预编译的概念搜索技能搜索用在找出第一个邮箱手机提取findall字符串切割筛选正则表达式正则表达式替换单个字符判断中括号选择一个字符正则表达式次数正则开头结尾括号与选择正则表达式特殊符号day19down 递归与爬虫... -
0230. 二叉搜索树中第 K 小的元素 0236. 二叉树的最近公共祖先 0238. 除自身以外数组的乘积 0240. 搜索二维矩阵 II 0279. 完全平方数 0309. 最佳买卖股票时机含冷冻期 0322. 零钱兑换 0328. 奇偶链表 ...
-
c-minus词法分析器
2020-04-28 10:40:39参数后面跟着方括号是数组参数,其大小是可变的。简单的整型参数由值传递。数组参数由引用来传递(也就是指针),在调用时必须通过数组变量来匹配。注意,类型“函数”没有参数。一个函数参数的作用域等于函数声明的... -
VC++科学计算器的设计V1_4Beta.rar
2010-03-23 04:54:59而在符号运算中表现卓越的Maple与Mathematica两个软件则只提供了对矩阵数值运算的弱支持,并且难以实现与外部应用程序的混合编程。MatCom与MATFOR则是提供了大量的矩阵运算函数库用于应用程序的二次开发,与MATLAB... -
SQL语法大全
2014-03-30 11:00:11SQL语法大全 SQL语法大全 1. ASP与Access数据库连接: dim conn,mdbfile mdbfile=server.mappath("数据库名称.mdb") set conn=server.createobject("adodb.connection") conn.open "driver={microsoft access ... -
C#微软培训教材(高清PDF)
2009-07-30 08:51:175.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2 显式类型转换 .53 6.3 小 结 .56 第七章 表 达 式 .58 7.1 操 作 符 .58 7.2 算术操作符和算术... -
Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3
2016-06-12 11:39:31实例064 字符串大小写转换 82 实例065 字符与Unicode码的转换 83 4.2 辨别字符串 84 实例066 判断用户名是否正确 84 实例067 用户名排序 85 实例068 判断网页请求与FTP请求 86 实例069 判断文件类型 87 实例070 判断... -
Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part1
2016-06-12 11:34:39实例064 字符串大小写转换 82 实例065 字符与Unicode码的转换 83 4.2 辨别字符串 84 实例066 判断用户名是否正确 84 实例067 用户名排序 85 实例068 判断网页请求与FTP请求 86 实例069 判断文件类型 87 实例070 判断... -
C#微软培训资料
2014-01-22 14:10:175.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2 显式类型转换 .53 6.3 小 结 .56 第七章 表 达 式 .58 7.1 操 作 符 .58 7.2 算术操作符和算术... -
C语言入门经典(第4版)--详细书签版
2013-02-02 17:16:502.8 使用浮点数完成除法运算 39 2.8.1 控制小数位数 40 2.8.2 控制输出的字段宽度 41 2.9 较复杂的表达式 41 2.10 定义常量 44 2.10.1 极限值 46 2.10.2 sizeof运算符 49 2.11 选择正确的类型 50 2.12 强制... -
C语言入门经典(第4版)--源代码及课后练习答案
2013-02-02 17:18:552.8 使用浮点数完成除法运算 39 2.8.1 控制小数位数 40 2.8.2 控制输出的字段宽度 41 2.9 较复杂的表达式 41 2.10 定义常量 44 2.10.1 极限值 46 2.10.2 sizeof运算符 49 2.11 选择正确的类型 50 2.12 强制... -
2009达内SQL学习笔记
2010-02-10 19:46:58多数DBMS不需要在单条SQL语句后加分号,但特定的DBMS可能必须在单条SQL语句后加分号。 SQL语句的最后一句要以 “;”号结束 二、写子句顺序 Select column,group_function From table [Where condition] ... -
C程序范例宝典(基础代码详解)
2013-05-17 00:15:35实例005 3个数由小到大排序 6 实例006 a2+b2 8 实例007 整倍数 9 实例008 判断闰年 10 实例009 阶梯问题 11 实例010 评定成绩 12 实例011 整数加减法练习 13 实例012 模拟ATM机界面程序 14 1.3 ... -
C语言编程要点
2017-09-18 00:10:3716.2. 函数参数类型必须在函数参数表中或紧跟其后的部分中说明吗? 217 16.3. 程序中必须包含main()的原型吗? 218 16.4. main()应该总是返回一个值吗? 219 第17章 用户界面——屏幕和键盘 219 17.1. 为什么直到程序...
-
3.4: 缓存DNS 、 Split分离解析 、 电子邮件通信 、 Web服务器项目实战(1).docx
-
计网笔记:
-
LVS + Keepalived 实现 MySQL 负载均衡与高可用
-
MySQL NDB Cluster 负载均衡和高可用集群
-
工业互联网信息安全设计.pptx
-
关于${pageContext.request.contextPath}的理解(转载)
-
爬虫初步了解
-
谷歌相册备份backupandsync.exe
-
FFmpeg4.3系列之16:WebRTC之小白入门与视频聊天的实战
-
打卡第一日
-
2018年中央民族大学854计算机基础综合考研真题
-
NFS 实现高可用(DRBD + heartbeat)
-
基于微信的同城小程序、校园二手交易小程序 毕业设计毕设源码使用教程
-
CAM350教程.rar
-
LeetCode141.环形链表[立flag]|刷题打卡
-
Java一经推出就那么火,企业和程序员为什么要选择Java作为首选的编程语言
-
vue基础
-
【拯救者 】数据库系统概论速成
-
用Go语言来写区块链(一)
-
Git: 教你如何在Commit时有话可说