波兰、逆波兰表达式

软考习题里遇到了这样一道题,给出了一个逆波兰式,让求它对应的中缀表达式。

逆波兰式:ab-cd+* ,它的中缀表达式是(a-b)*(c+d)

思考:

这让我蒙圈了,这是为什么呢。怎么得到的呢,应该有什么规律的吧。

首先我们要知道:

波兰式:前缀表达式

逆波兰式:后缀表达式

了解这三个表达式之前,我们需要知道


表达式


解释


例子


前缀


不含括号的的算数表达式,将运算符写在前面,操作数写在后面


*+ 2 1 3


中缀


必须含括号,操作符处于操作数的中间


(2+1)*3


后缀


不含括号,运算符放在两个运算对象的后面。


3 2 + 3 *

这三个表达式的重点就是他们之间的转换,学会转换,对这三个表达式也就了解的差不多了,那么到底怎么转换的呢?

给出一个中缀表达式,转化为前缀和后缀表达式。

例如我们做的这道题,中缀表达式答案是(a-b)*(c+d),我们看来验证一下他正确不。

步骤:

第一步:按照运算符的优先级,对所有的运算单位加括号。

((a-b)*(c+d))

第二步转换:

转换为前缀:把运算符号移动到对应的括号前面,然后去掉括号。

“*”移最前面;“-”移到 
-(ab);“+”移到+(cd)

得到:*-(ab)+(cd)去括号后:*-ab+cd

转换为后缀:

“*”移到最后;“-”移到(ab)-;“+”移到(cd)+

得到:(ab)-(cd)+*去括号后:ab-cd+*

以上方法适用于较为简单的选择题,对于真正的算法题我觉得就给多想想了。

对于前缀、中缀和后缀的知识不仅是是他们的转化,还有很多知识,以后会再了解的。

而对于逆波兰式,冲着这么好听的名字,也得明白他是什么吧,其实就是波兰逻辑学家的一个人发明的一种表示表达式的方式。这种表示法的优点就是根据运算对象和算符的出现次序进行计算,便于用栈实现求值。

只学会了简单的转换,对于这方面的认识还远远不够,其实中缀表达式转化为后缀表达式也是数据结构里的一个算法题。逆波兰表达式只用于两种简单操作,入栈和出栈。按顺序扫描逆波兰表达式,如果当前字符是变量或者数字就压栈,如果是运算符,则将栈顶两个元素弹出想想运算,结果再入栈,最后当表达式扫描完后,栈里就是结果。

个人理解的不是很深刻,具体到算法题估计还是有一定的困难,不过走一步算一步,能理解多少是多少。这个算法会不会考也不知道,不总结就更不认识了。先总结了再说,有什么错误请大家指点,互相交流。

时间: 2024-10-14 16:12:05

波兰、逆波兰表达式的相关文章

逆波兰表达式

1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用prin

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]

使用逆波兰式进行表达式求值

中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现.实现和原理讲解有一点不同,需要进一步进行细化. 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止. 上面的规则转换成下面的执行规则: 1.遇到操作数:直接输出(添加到后缀

逆波兰式与表达式求解

/*************** 逆波兰式即后缀表示法 预处理 ---- 中序表达式->逆序表达式(infix to postfix) 算法: while(表达式非空) if (遇到操作数) 直接输出 else if (遇到操作符op) op是( 直接入栈s op是) s.push输出,直到( op是四则运算,则 if (s为空 || s.top为( || op 优先级高于 s.top) op 入栈 else s.push输出 if (!s.empty) s.push输出 计算 算法: if (

求解逆波兰表达式的值

题目: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another expression. Some examples:   ["2", "1", "+", "3", "*"

[Leetcode] evaluate reverse polish notation 计算逆波兰表达式

Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are+,-,*,/. Each operand may be an integer or another expression. Some examples: ["2", "1", "+", "3", "*"] -> (

栈的操作实现逆波兰表达式的计算

代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef double ElemType; typedef struct { ElemType *base; ElemType *top; int StackSize; }sqStack; v

C++实现 逆波兰表达式计算问题

C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack { private: int size; int top; float *listArray; public: Stack(int sz=20); ~Stack(); bool push(float it);//入栈 bool pop(float& it);//出栈 bool isEmpty();//

续前篇-关于逆波兰表达式的计算

相对于逆波兰表达式的转换,逆波兰表达的计算可谓简单不少. 具体计算方法参考:http://www.cnblogs.com/vpoet/p/4659546.html 这里也大致梳理一下: 1.新建一个栈将逆波兰表达式的数字依次压入栈中 2.当遇到运算符时,出栈两个数同时将运算结果压栈 3.重复步骤2直到计算计算,栈中的元素即为逆波兰表达式的计算结果. 实现如下: 1 #include <iostream> 2 #include <stack> 3 using namespace st

逆波兰表达式的C实现

复习下数据结构,用栈简单实现逆波兰表达式,参考文档: http://www.nowamagic.net/librarys/veda/detail/2307 http://www.nowamagic.net/librarys/veda/detail/2306 直接上代码: /** *code by lichmama from cnblogs.com *@逆波兰表达式的C实现 *算术支持的运算模式: * 四则运算: * 操作数不得大于9: * 中间数(即运算当中的临时变量)不得超过127 **/ #