浅谈前、中、后缀表达式

浅谈前、中、后缀表达式

前、中、后缀表达式是信息学奥林匹克竞赛中比较鸡肋的知识点。但是知识点在考纲范围内,而且中缀表达式转后缀表达式是比较有用的知识。所以在这里为大家简单介绍一下。

之前在自学前、中、后缀表达式的时候,发现网上的很多博客和讲解的思路都不是很明了,或者就是对新手不是很友好,感谢@JZYShurak的讲解,让我对这个东西建立了一个直观的认识。所以我来补一篇比较基础,比较好理解,语言比较简洁的博客。希望能对各路大佬有所些许的帮助。


中缀表达式

中缀表达式就是我们生活中常用的表达式,简单来讲,就是人能算的表达式。但是,计算机算不了。。(这里说的计算机算不了不是说这个东西不能用计算机算,而是计算机算人能算的表达式的时候不是像我们那样思考)。

例子:

\(6\times 12+9-14\)。

(PS一些无关紧要的废话:上面的几个数字对博主有着一些特殊意义(斜眼笑))


后缀表达式

为什么不用”前——中——后“这个顺序介绍呢?因为中缀表达式是最容易理解的”小学三年级以上的水平就能懂“。而后缀表达式的理解和运算过程则涉及到了一种数据结构:栈。

如果对栈还不熟悉或者不明白,就请自行补习了,这应该是计算机科学中最基础的数据结构了。

还拿上面的例子:

\(6\times 12+9-14\)。

后缀表达式的实现过程是这样的:

首先,建一个存运算符号的栈,一个存数字的栈。

然后,碰到一个符号,就压到符号栈中,碰到数字就压到数字栈中,如果数字栈中有两个数,就从符号栈中弹出一个符号来对这两个数进行运算,把结果压回数字栈中,以此类推。

比如,上面的式子就可以写成如下的后缀表达式:

\(\times 6 + 12 \quad 9 - 14\)。

显然,针对一个确定的中缀表达式,其所对应的后缀表达式不唯一。


前缀表达式

前缀表达式的实现原理和后缀表达式大同小异,而唯一需要注意的是,前缀表达式是从后往前转的!!

也就是说,上面的例子\(6\times 12+9-14\)可以被转成如下的前缀表达式:

\(14-9 \quad 12+6\times\)。

原文地址:https://www.cnblogs.com/fusiwei/p/11615499.html

时间: 2024-08-28 06:03:10

浅谈前、中、后缀表达式的相关文章

前中后缀表达式以及表达式树

中缀表达式就是我们平时喜闻乐见的形式:二元运算符在中间,它的两个操作数在两侧: a + b * c + ( d * e + f ) * g 后缀和前缀表达式,顾名思义就是把运算符分别放在前面或者后面,注意没有括号,手工转换方法是按运算顺序添加括号,然后把相应的运算符置于相应的括号的前或后,如: ((a + ( b * c)) + (((d * e) + f) * g)) 放到前面有: +(+(a*(b c))*(+((*(d e))f)g)) 放到后面有: ((a(b c)*)+(((d e)*

浅谈hadoop中mapreduce的文件分发

最近在做数据分析的时候,需要在mapreduce中调用c语言写的接口,此时就需要把动态链接库so文件分发到hadoop的各个节点上,原来想自己来做这个分发,大概过程就是把so文件放在hdfs上面,然后做mapreduce的时候把so文件从hdfs下载到本地,但查询资料后发现hadoop有相应的组件来帮助我们完成这个操作,这个组件就是DistributedCache,分布式缓存,运用这个东西可以做到第三方文件的分发和缓存功能,下面详解: 如果我们需要在map之间共享一些数据,如果信息量不大,我们可

浅谈C#中的常量、类型推断和作用域

浅谈C#中的常量.类型推断和作用域 作者: 字体:[增加 减小] 类型:转载 时间:2013-12-19我要评论 这篇文章主要介绍了C#中的常量.类型推断和作用域,有需要的朋友可以参考一下 一.常量常量是其值在使用过程中不会发生变化的变量.在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量: const int a=100;//a的值将不可以改变 常量的特征: 1.常量必须在声明时初始化.指定了其值以后,就不能再修改了.2.常量的值必须能在编译时用于计算.因此不能从

浅谈数据库系统中的cache(转)

http://www.cnblogs.com/benshan/archive/2013/05/26/3099719.html 浅谈数据库系统中的cache(转) Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出 的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据.在很多情况下,这两个名词并没有严格区分,常常把读写混合类型称为buffer cache,本文后续的论述中,统一

浅谈oracle中rowid和rownum

[ 概要 ] 刚刚接触oracle的同学可能常常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有很大的帮助, 下面偶就抛砖引玉, 简单地谈谈他们之间的区别吧. [ 比较 ] rowid和rownum都是oracle中的伪列, 但他们还是存在本质区别: rowid: 是物理地址, 用于定位数据表中数据的位置, 它是唯一的且不会改变. rownum: 是根据查询的结果集给每行分配的一个逻辑编号, 查询结果不同, rownum自然不同. 对于同一条记录, 查询条件不同,

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

浅谈前后端分离

浅谈前后端分离 所谓的前后端分离,到底是分离什么呢?其实就是页面的渲染工作,之前是后端渲染好页面,交给前端来显示,分离后前端需要自己拼装html代码,然后再显示.前端来管理页面的渲染有很多好处,比如减少网络请求量,制作单页面应用等.事情听起来简单,但这么一分离又会牵扯到很多问题,比如: 资源的按需加载.尤其是在单页应用中. 页面展现逻辑.分离让前端的逻辑陡增,需要有一个良好的前端架构,如mvc模式. 数据校验.因为页面数据都是从后端请求来的,必须校验要展示的数据是否合法,避免xss或其他安全问题

浅谈正则表达式中的分组和引用

问题 我的答案 说明 由正则表达式如何匹配相同字符出发,讲讲正则表达式中的选择.分组和引用. 问题 在外刊君读者群中看到有人提出这样的一个需求: 把字符串切成连续相同字符的正则怎么写?比如abbcccdddd切成a,bb,ccc,dddd 之前我对正则表达式也是略有研究,想尝试一下.其实我对正则表达式的学习基本完全来源于犀牛书的第10章,真正看懂这一章,我觉得操作正则表达式应该不在话下. 我的答案 先给出我的答案吧: 'abbccddd'.match(/(w)1*/g) // ["a"

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初