中缀表达式

逆波兰表达式

守給你的承諾、 提交于 2020-01-04 13:53:11
逆波兰表达式 表达式一般由操作数(Operand)、运算符(Operator)组成,例如算术表达式中,通常把运算符放在两个操作数的中间, 这称为中缀表达式(Infix Expression),如A+B。 波兰数学家Jan Lukasiewicz提出了另一种数学表示法,它有两种表示形式: 把运算符写在操作数之前,称为波兰表达式(Polish Expression)或前缀表达式(Prefix Expression),如+AB; 把运算符写在操作数之后,称为逆波兰表达式(Reverse Polish Expression)或后缀表达式(Suffix Expression),如AB+; 其中,逆波兰表达式在编译技术中有着普遍的应用。 算法: 一、 将中缀表达式转换成后缀表达式算法: 1、从左至右扫描一中缀表达式。 2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈 3、若读取的是运算符 (1) 该运算符为左括号"(",则直接存入运算符堆栈。 (2) 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止。 (3) 该运算符为非括号运算符: (a) 若运算符堆栈栈顶的运算符为括号,则直接存入运算符堆栈。 (b) 若比运算符堆栈栈顶的运算符优先级高或相等,则直接存入运算符堆栈。 (c) 若比运算符堆栈栈顶的运算符优先级低

【转】中缀表达式转换为后缀表达式

血红的双手。 提交于 2019-12-17 10:47:35
一、后缀表达式求值 后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储。假定待求值的后缀表达式为: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)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( "

深入理解前缀、中缀、后缀表达式

我是研究僧i 提交于 2019-12-05 19:36:31
1.我们首先来看一下,什么是前缀、中缀、后缀表达式: 中缀表达式: 2 - 3 * 4 后缀表达式:2 3 4 * - 前缀表达式:- 2 * 3 4 简单介绍下,前中后的划分依据为两个数字的操作符处于两个数字的前面,中间还是后面,其中中缀表达式为我们日常生活中常见的表达形式。 2.重要操作过程 后缀表达式求值过程: 从左到右扫描后缀表达式:遇到数字就将其压入栈中;遇到操作符,则取出栈顶的两个元素(栈顶元素为a, 另一个为b),并计算b 操作符 a的取值,并将结果重新压入栈中。扫描整个表达式结束后,栈中数值即为整个表达式的结果。 前缀表达式求值过程: 从右向左扫描前缀表达式:其他操作除了(栈顶元素为b, 另一个为a)与后缀表达式求值,不再赘述。 中缀表达式转换为后缀表达式过程: 从左到右扫描中缀表达式,遇到数字 中缀表达式转换为前缀表达式过程 来源: oschina 链接: https://my.oschina.net/u/1261015/blog/506660

什么是中缀表达式与后缀表达式

匿名 (未验证) 提交于 2019-12-02 23:56:01
一、中缀表达式转化为后缀表达式表达式与后缀表达式   在日常应用中,算术表达式中运算符总是出现在两个操作数之间,例如5*(7-2*3)+8/2,这种形式称为中缀表达式。计算一个中缀表达式需要知道运算符的优先级和结合性。乘除是高优先级,加减是低优先级,优先级相同时他们都是左结合的,也就是从左计算到右。有括号就要计算括号内的表达式。 中缀表达式利于人的理解,但不便于计算机的处理。 因此需要将中缀表达式转换成后缀表达式,以方便计算机处理。所谓后缀表达式就是将运算符放在运算数之后。后缀表达式也称为逆波兰表达式。 比如: 中缀表达式为:1+(2-3)*4+4/2 对应后缀表达式为:1 2 3 - 4* + 4 2 / + 来源:博客园 作者: 德豪 链接:https://www.cnblogs.com/dehao/p/11428922.html

基于栈的中缀算术表达式求值

二次信任 提交于 2019-12-02 20:13:20
#include<iostream> #include<string> #include<cstring> #include<iomanip> using namespace std; typedef struct StackNode *LStack; /* 两个栈,一个是字符,一个是数字, 先判断是什么字符,然后调用不同的函数 */ typedef struct Data { double number; char op; }; struct StackNode { Data data; LStack next; }; double Function(double a, double b, char op) { if (op == '+') return a + b; else if (op == '-') return b - a; else if (op == '*') return b * a; else if (op == '/') return b / a; } char Judge(char a, char b) { if ((a == '('&&b == ')') || (a == '='&&b == '='))//a\b都为等号? return '='; else if (a == '(' || a == '=' || b == '(' || (a == '+'

中缀表达式转换为后缀表达式

半腔热情 提交于 2019-11-30 15:59:53
中缀表达式转换成后缀表达式   1、概述     可以看到,后缀表达式适合计算式进行运算,但是人却不太容易写出来,尤其是表达式很长得情况下,因此在开发中,需要将 中缀表达式 转成 后缀表达式 。   2、具体步骤 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2; 2.从左至右扫描中缀表达式; 3.遇到操作数时,将其压s2; 4.遇到运算符时,比较其与s1栈顶运算符的优先级:  (1)如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;  (2)否则,若优先级比栈顶运算符的高,也将运算符压入s1;  (3)否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4.1)与s1中新的栈顶运算符相比较; 5.遇到括号时: (1)如果是左括号"(",则直接压入s1 (2)如果是右括号")",则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃6.重复步骤2至5,直到表达式的最右边 7.将s1中剩余的运算符依次弹出并压入s2 8.依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式      3、案例     将中缀表达式 "1+((2+3)*4)-5" 转换为后缀表达式的过程如下:     结果为:"1 2 3 + 4 * 5 - "        4、思路分析示意图   5、代码实现 1 import java.util

中缀表达式转化为多叉树

不羁岁月 提交于 2019-11-27 01:26:31
中缀表达式转化为树结构,难点是中缀表达式中有括号和优先级。算法分解为以下几个步骤: 1、首先去除括号和优先级,也就是把中缀表达式转化为后缀表达式; 2、根据后缀表达式,可以生成二叉树; 3、把二叉树转化为多叉树。 转载于:https://www.cnblogs.com/nzbbody/p/3335558.html 来源: https://blog.csdn.net/weixin_30528371/article/details/99234437

表达式转化(中缀,后缀,前缀)

寵の児 提交于 2019-11-27 01:26:25
1、为什么要把中缀表达式转化为后缀,前缀? 计算机没法计算带有括号,以及区分优先级的表达式,或者说很难计算。使用后缀,前缀,消除了括号和优先级。 2、计算机如何计算后缀,前缀表达式? 计算后缀:从左到右遍历后缀表达式,遇到操作数,放进栈,遇到操作符,栈顶两个数出栈,进行运算,运算结果放进栈,直到读完后缀表达式。 计算前缀:从左到右遍历前缀表达式,遇到操作符,放进栈,遇到操作数,查看栈顶,栈顶为操作符,放进栈,栈顶为操作数,取出栈顶操作数和操作符,进行运算,运算后继续判断栈顶的情况。 3、中缀表达式如何转化为后缀,前缀表达式? 转化为后缀: 从左到右遍历中缀表达式, 遇到操作数,输出,遇到操作符,当前操作符的优先级 大于 栈顶操作符优先级,进栈,否则,弹出栈顶优先级 大于等于 当前操作符的操作符,当前操作符进栈。 转化为前缀: 从右到左遍历中缀表达式, 遇到操作数,输出,遇到操作符,当前操作符的优先级 大于等于 栈顶操作符优先级,进栈,否则,弹出栈顶优先级 大于 当前操作符的操作符,当前操作符进栈。 转载于:https://www.cnblogs.com/nzbbody/p/3335226.html 来源: https://blog.csdn.net/weixin_30826095/article/details/99234439