1.后缀表达式(逆波兰式)与中缀表达式
逆波兰式是波兰逻辑学家卢卡西维奇发明的一种表示表达式的方式,这种表示法把运算量(操作数)写在前面,把运算符卸载后面。
1.1 中缀表达式转后缀表达式
1.设定运算符栈;
2.从左到右遍历中缀表达式的每个数字和运算符;
3.若当前字符是数字,则直接输出成为后缀表达式的一部分;
4.若当前字符为运算符,则判断其与栈顶运算符的优先级,若优先级大于栈顶运算符,则进栈;若优先级小于等于栈顶运算符,退出栈顶运算符成为后缀表达式的一部分,然后将当前运算符放入栈中;
5.若当前字符为“(”,进栈;
6.若当前字符为“)”,则从栈顶起,依次将栈中运算符出栈成为后缀表达式的一部分,直到碰到“(”。将栈中“(”出栈,不需要成为后缀表达式的一部分,然后继续扫描表达式直到最终输出后缀表达式为止。
例:
1.a+b的逆波兰式:ab+
2.(a+b)*c的逆波兰式:ab+c*
3.a+b*c的逆波兰式:abc*+
4.a=b*c+b*d的逆波兰式:abc*bd*+=
5.a*(-b+c)的逆波兰式:ab-c+*(注:此处的-为一元运算符,表示的是负号,不是减号)
优先级排序:https://www.cnblogs.com/ningvsban/p/3942302.html
# 优先级排序为:算术运算符 > 关系运算符 > 赋值运算。
# 算术运算符中,乘法运算符【*】、除法运算符【/】、取余运算符【%】属于优先级第三级,加法运算符【+】、减法运算符【-】属于第四级。
# 关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于。其中,关系运算符【< > <= >= 】属于# 优先级第六级,等于运算符【==】、不等于运算符【!=】属于优先级第七级。
# 赋值运算符【= += -= *= /= %= >>= <<.= &= |= ^=】属于优先级第第十四级。
所以,优先级排序为:算术运算符高于关系运算符高于赋值运算。
以上面第四个(a=bc+bd)为例:
a*(-b+c)的过程:
1.2 后缀表达式转中缀表达式
把后缀表达式逐个元素的压入到栈中,当压入的都是字符,则不采取任何操作,当压入的是运算符,则把运算符下面的两个数字弹出和运算符进行运算,然后把结果继续压入到栈中。
注:是栈中底下的一个在前面,如:
该表达式为e-3,而不是3-e。
中缀表达式转后缀表达式,可以用后缀表达式转中缀表达式相互验证
abcbd+= 转中缀表达式:
ab+c* 转中缀表达式:
2.三元式
三元式是一种用于表示计算机程序中的指令或表达式的中间代码形式。它由三个部分组成:操作符、操作数1和操作数2。操作符表示要执行的操作,例如加法、减法、乘法等,而操作数1和操作数2是参与操作的变量或值。
三元式的使用可以简化程序的分析和优化过程,因为它可以将复杂的表达式或指令转化为更简洁、易于处理的形式。它通常在编译器或解释器的编译过程中生成,并被用于构建优化的程序执行代码或生成目标代码。
(op,arg1,arg2)
例:a=b*c+b*d
(1)(*,b,c)
(2)(*,b,d)
(3)(+,(1),(2))
(4)(=,(3),a,)
3.四元式
四元式是一种中间代码形式,用于表示计算机程序中的指令或表达式。与三元式类似,它由四个部分组成:操作符、操作数1、操作数2和结果。
操作符表示要执行的操作,例如加法、减法、乘法等。操作数1和操作数2是参与操作的变量或值。结果表示操作的结果将存储在哪个变量中。
四元式的主要目的是提供一个更灵活的表示方式,使得编译器或解释器可以进行更复杂和高级的优化。比如,它可以将复杂的表达式分解为多个简单的四元式指令,方便生成更高效的目标代码。
(op,arg1,arg2,result)
例:a=b*c+b*d
(1)(*,b,c,t1)
(2)(*,b,d,t2)
(3)(+,t1,t2,t3)
(4)(=, ,t3,a,)
例:(x=-a)
(1)(-,a, ,t1)
(2)(=,t1, ,x)