当前位置: 首页 > 编程日记 > 正文

中缀、前缀表达式

为什么80%的码农都做不了架构师?>>>   hot3.png

一、后缀表达式求值

后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储。假定待求值的后缀表达式为:6  5  2  3  + 8 * + 3  +  *,则其求值过程如下:

1)遍历表达式,遇到的数字首先放入栈中,此时栈如下所示:

2)接着读到“+”,则弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中。

3)读到8,将其直接放入栈中。

4)读到“*”,弹出8和5,执行8*5,并将结果40压入栈中。而后过程类似,读到“+”,将40和5弹出,将40+5的结果45压入栈...以此类推。最后求的值288。

二、中缀表达式转后缀表达式

2.1)规则

中缀表达式a + b*c + (d * e + f) * g,其转换成后缀表达式则为a b c * + d e * f  + g * +。

转换过程需要用到栈,具体过程如下:

1)如果遇到操作数,我们就直接将其输出。

2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。

3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。

4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。

5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。

2.2)实例

规则很多,还是用实例比较容易说清楚整个过程。以上面的转换为例,输入为a + b * c + (d * e + f)*g,处理过程如下:

1)首先读到a,直接输出。

2)读到“+”,将其放入到栈中。

3)读到b,直接输出。

此时栈和输出的情况如下:

4)读到“*”,因为栈顶元素"+"优先级比" * " 低,所以将" * "直接压入栈中。

5)读到c,直接输出。

此时栈和输出情况如下:

6)读到" + ",因为栈顶元素" * "的优先级比它高,所以弹出" * "并输出, 同理,栈中下一个元素" + "优先级与读到的操作符" + "一样,所以也要弹出并输出。然后再将读到的" + "压入栈中。

此时栈和输出情况如下:

7)下一个读到的为"(",它优先级最高,所以直接放入到栈中。

8)读到d,将其直接输出。

此时栈和输出情况如下:

9)读到" * ",由于只有遇到" ) "的时候左括号"("才会弹出,所以" * "直接压入栈中。

10)读到e,直接输出。

此时栈和输出情况如下:

11)读到" + ",弹出" * "并输出,然后将"+"压入栈中。

12)读到f,直接输出。

此时栈和输出情况:

13)接下来读到“)”,则直接将栈中元素弹出并输出直到遇到"("为止。这里右括号前只有一个操作符"+"被弹出并输出。

14)读到" * ",压入栈中。读到g,直接输出。

15)此时输入数据已经读到末尾,栈中还有两个操作符“*”和" + ",直接弹出并输出。

至此整个转换过程完成。程序实现代码后续再补充了。

2.3)转换的另一种方法

1)先按照运算符的优先级对中缀表达式加括号,变成( ( a+(b*c) ) + ( ((d*e)+f) *g ) )

2)将运算符移到括号的后面,变成((a(bc)*)+(((de)*f)+g)*)+

3)去掉括号,得到abc*+de*f+g*+

2.4)转换的第三种方法

由于二叉树本身结构的特殊性,使得我们可以利用它来很轻松地将中缀表达式转变成后缀表达式,事实上,只要根据中缀表达式建立好相应的二叉树之后,直接对二叉树进行前序遍历和后序遍历便可得到前缀表达式和后缀表达式。在利用二叉树来表示表达式时,用叶子节点来存储操作数,用内部节点存储操作符,比如这样一个表达式3*5+5/2+(3+5)*2,表示成二叉树的形式(注意其有等同的其他形式)就是:

其实讲中缀表达式的过程转变成二叉树的形式是一个递归的过程,比如有一个表达式,其对应的的二叉树的根节点必定是优先级最低的操作符(也就是说是整个表达式中最后进行的运算操作),然后再在操作符的左部分中找出最后进行的操作符作为根节点的左孩子,在操作符的右部分中找出最后进行的操作符作为根节点的右孩子,然后知道左部分或者右部分是单纯的操作数,则作为叶子节点,直到整个二叉树建立完毕。

转载于:https://my.oschina.net/lin546/blog/1579675

相关文章:

Linux之tee命令

语  法:tee [-ai][--help][--version][文件...]补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。参  数:-a或--append  附加到既有文件的后面,而非覆盖它&…

在WinXP上通过Virtual PC安装WinCE

开发WinCE程序的调试,要么用Emulator,要么用触摸屏等等硬件,模拟器不真实,硬件又难找还不易随身带。象我这样穷得买不了带CE的PDA,懒得不想下巨型的PB、VS,要随时调试还真不容易。试过VMWare,效…

valgrind概述及错误分析

Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具.而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。 Valgrind包…

超过C++、压制Java与C,Python拔得TIOBE年度编程语言!

作者 | 屠敏来源 | CSDN(ID:CSDNNews)如同两个月前,TIOBE 编程语言社区于官网预料的那般,2018 年的年度编程语言终将在一众老牌编程语言如 Java、C、C、Python、Visual Basic .NET 中诞生。近日,TIOBE 排行…

CodeArt SharePoint Permission Extension 1.0 beta publish

正式发布1.0版本,已经打包成wsp,请到以下地址下载:http://sppex.codeplex.com/Release/ProjectReleases.aspx?ReleaseId30671 解压后,运行wsp_addsolution.cmd安装解决方案,到管理中心-》操作-》解决方案管理安装解决…

《请不要回应外星人2019》

作者 | 若名出品 | AI科技大本营 今天早上,关于“加拿大天文学家发现 15 亿光年外讯号”的话题一度被推到了微博热搜榜第二位,当然也引发了全球范围内的关注。舆论导向都是,“人类该不该做出回应?”翻了一圈评论,人…

如何使用Log4j?

要学习什么是log4j,那我们也知道log4j能干吗??这里就不阐述了,可以自己去google1、 Log4j是什么? Log4j可以帮助调试(有时候debug是发挥不了作 用的)和分析,要下载和了解更详细的内容,还是访问其官方网站吧&#xf…

解决:无法创建该DNS 服务器的委派

第一次安装AD DNS的时候,你可能遇到以下的提示,无法创建该DNS 服务器的委派,这是一个提示,而不是一个报错。 以下是详细的说明。 将具有 DNS 服务器的新 Windows Server 2008 或 Windows Server 2008 R2 域控制器安装到 treyr…

SQL to Elasticsearch java code

把Elasticsearch当成Database用,因为Elasticsearch不支持SQL,就需要把SQL转换成代码实现。 1.按某个field group by查询count SELECT fieldA, COUNT(fieldA) from table WHERE fieldC "hoge" AND fieldD "huga" AND fieldB…

【转载】linux静态链接库与动态链接库的区别及动态库的创建

这篇文章对于动态库的概念及使用介绍的很不错,故收藏了。一、引言通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library&a…

买不到回家的票,都是“抢票加速包”惹的祸?

作者 | 屠敏来源 | CSDN(ID:CSDNNews)距离国家法定春节假日不足一个月,且首批除夕票已于近日正式开售。但万万没想到,当人、钱、手机、PC、iPad 万事俱备之际,东风刮得太快,眼巴巴盯着将于整点开…

HTSRealistic missions 10:Holy Word High School

这到题说实在的挺难。。。首先进入页面,进去后查看源代码发现有个空图片,图片是个链接,链接到staff.php。点击进入要求用户名密码,尝试注入,无效在来至主页,有个staff list的链接,点进去&#x…

Makefile的东西

宏定义: 1. Makefile中直接定义宏 OBJECTSfilea.o fileb.o filec.o #定义宏 Zfiled.oprog: $(OBJECTS) #引用宏cc $(OBJECTS) -o prog #我的机子环境中需要4个tab键prog1: $Z #引用宏,单个字符无需加园括号cc $Z -o prog12. 在make命令之后带有新的宏定…

TensorFlow 2.0开发者预览版发布

整理 | Jane出品 | AI科技大本营从去年 8 月 Google 公开发布消息正在研发 TensorFlow 2.0 ,让我们在 12 月 提前看到了一些 高级 API 的变化,今天我们终于等来了“tf-nightly-2.0”,一个 TensorFlow 2.0 开发者预览版。在今天 Wicke 的邮件中…

DOCKER OVERLAY NETWORK consul 注册

下载 consul 二进制包并启动 wget https://releases.hashicorp.com/consul/0.9.2/consul_0.9.2_linux_amd64.zip unzip consul_0.9.2_linux_amd64.zip mv consul /usr/bin/consul && chmod x /usr/bin/consul nohup consul agent -server -bootstrap -ui -data-dir /va…

怎么写shell脚本才能不耍流氓?

1、不记录日志的 SHELL 脚本就是耍流氓! 我们经常在工作中会遇到一个苦恼的事情,一个 Shell 脚本到底干了什么,什么时候开始执行,什么时候结束的。尤其是数据库备份,我们想知道我们的 MySQL 数据库备份时间。所以给脚本…

透过腾讯张潼离职事件,看AI研究院如何才算成功?

作者 | 洪亮劼编辑 | 琥珀【AI科技大本营导读】近日腾讯 AI Lab 第一负责人张潼博士的离职事件,让不少圈内人士对企业 AI 研究院/实验室的定位、落地能力等问题进行了深刻思考和讨论。据最新消息,张潼未来将回到学界,继续 AI 领域的学术研究&…

java vs .net

... vs paramsjavaprivatestaticintsumUp(int... values) { intsum 0; for(inti 0; i < values.length; i) { sum values[i]; } returnsum; } .netparams 关键字在方法成员的参数列表中使用&#xff0c;为该方法提供了参数个数可变的能力它在只能出现一次并…

#QCon# Devops

今天参加了QCon2011 杭州。听了百度项目管理部的乔梁关于“Devops”的分享。比如如下&#xff1a; continuous integration —— Dev &#xff0c; QA agile —— Business&#xff0c;Dev&#xff0c;QA devops —— Dev&#xff0c;QA&#xff0c;Ops Devops Culture Too…

雷军的100亿计划:不服就干,生死看淡

图片来自小米官网整理 | 琥珀出品 | AI 科技大本营1 月 10 日&#xff0c;红米品牌正式独立。11 日&#xff0c;雷军在小米年会上宣布&#xff0c;2019 年&#xff0c;小米将正式启动“手机AIoT”双引擎战略&#xff0c;作为小米未来五年的核心战略。同时&#xff0c;未来 5 年…

cppcheck源码学习(一)

今天整理了下cppcheck的源码结构&#xff0c;为什么通过写一个个子文件就能够扩展cppcheck的功能呢&#xff1f; 看了下代码&#xff0c;并通过简化代码&#xff0c;略懂一二了。 首先我们定义一个基类test.h&#xff0c;只定义一个头文件足够&#xff1a; #ifndef TESTH #defi…

产品与技术优势发威 用友U9截击SAP ORACLE

随着金融危机的全面爆发&#xff0c;实体经济的冬天也随之而来。也正是金融危机&#xff0c;使得多年以来一直高调占据媒体头条的管理软件厂商们略显低迷&#xff0c;使一直剑拔弩张的中国管理软件市场&#xff0c;进而升级为一场“血腥四溅的肉搏”。<?xml:namespace pref…

oracle中的exists 和 not exists 用法详解

from&#xff1a;http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.htmloracle中的exists 和 not exists 用法详解 (2009-05-14 16:58:18) 有两个简单例子&#xff0c;以说明 “exists”和“in”的效率问题1) select * from T1 where exists(select 1 from T2 where T1.aT2.a)…

清华北大“世界排名断崖式下跌”?

作者 | 琥珀出品 | AI 科技大本营为什么人们疯狂地爱着排名&#xff1f;基本每过一年公布的全球大学排行榜&#xff0c;都会吸引不少的利益相关方甚至吃瓜群众的集体关注。每每此时&#xff0c;网络上泛滥着的却是眼花缭乱、无法令人辨别真假的数字依据&#xff0c;甚至是“专家…

#Qcon# 分享

明天被领导要求分享Qcon体会&#xff0c;实在是件不怎么容易的事情。Qcon这样的企业开发大会&#xff0c;很多东西必须要实际应用过才能深有体会&#xff0c;泛泛的谈似乎又觉得乏味。好吧&#xff0c;泛一下就泛一下吧&#xff0c;总比废话要强(上一句是我认为的废话)。 第二天…

判断一个数为多少位 比如 3 是 1位 102 是3位。

12345678910111213141516//判断一个数为多少位 比如 3 是 1位 102 是3位。#include <iostream>using namespace std; int main() {int a; cout<<"input a num"<<endl; cin>>a; int t1; for(int i10;i<10000000;i*10,t) if(a<i) brea…

完成CitrixVDI架构了解及部署测试

很是不错&#xff0c;经过近两周时间对CitrixVDI架构的学习&#xff0c;有了初步的了解和认识&#xff0c;同时&#xff0c;也在家中完成了整个体系的部署实验。由于公司正在使用着VMware的VDI(Viewe3.0)&#xff0c;又在测试CitrixVDI&#xff0c;使两者终于有了直接的对比&am…

keepalive

高可用解决方案&#xff1a; heartbeat corosync cman keepalived 前面我们讲解了&#xff0c;LVS&#xff08;负载均衡器&#xff09;、Heartbeat、Corosync、Pacemaker、Web高可用集群、MySQL高可用集群、DRDB、iscsi、gfs2、cLVM等&#xff0c;唯一没有讲解的就是LVS可用&a…

普元王葱权:数字化时代需要新一代的大数据应用平台架构

记者 | 杨丽出品 | AI 科技大本营&#xff08;rgznai100&#xff09;2018 年 12 月 6 日&#xff0c;北京新云南皇冠假日酒店&#xff0c;由中国计算机学会主办&#xff0c;CCF 大数据专家委员会承办&#xff0c;CSDN、中科天玑数据科技股份有限公司协办的 2018 中国大数据技术…

Agile DSL Development in Ruby 笔记

pdf见&#xff1a;http://obiefernandez.com/presentations/obie_fernandez-agile_dsl_development_in_ruby.pdf 1. What is DSL ——designed for a specific domain ——captures jargon in executable form ——can be internal or external 2. How to design Ruby DSL (…