前缀表达式是一个非常有用的表达式,它将中缀表达式转换成可以通过简单操作得到运算结果的表达式。例如,(a,b)*(c,d)转换成*、a、b、c、d,它的优点是只需两个简单的运算,即stack-in和stack-out,就可以解决任意中缀表达式的运算。其操作方式是:如果当前字符(或字符串)是数字或变量,则将其推入堆栈;如果是运算符,则堆栈顶部的两个元素将弹出堆栈并执行相应的操作,然后将结果推入堆栈。前缀表达式扫描完成后,堆栈中的内容就是中缀表达式操作的最终结果。
(1)表达式有三种形式:
中缀表达式:运算符放在两个操作数的中间,例如:(2,1)*3;
后缀表达式:不包含方括号,运算符放在两个操作数的后面,所有计算严格按照运算符出现的顺序从左到右进行(不考虑运算符的优先级规则,如:21)3*;
前缀表达式:与后缀表达式相同,不含括号,运算符放在两个操作数前面,如:*213。
(2)表达式计算:
由于后缀表达式中没有括号,因此无需确定优先级,并且计算严格从左到右进行,因此在计算机中计算后缀表达式比计算中缀表达式简单得多。
中缀表达式转换为后缀表达式的算法思想:
·读取数字时,直接发送到输出队列
·读取运算符t时,
a.在堆栈中弹出优先级高于或等于t的所有运算符,发送到输出队列;
b.t将其放在堆栈上
·读取左括号时,总是将其推入堆栈中
·读取右括号时,将其放在靠近堆栈顶部的第一个左括号中,面操作符逐个弹出,发送到输出队列,然后丢弃左括号。
使用后缀表达式进行计算的具体方法如下:
·建立一个堆栈s
·从左到右读取后缀表达式,读取数字时将其转换成数值并按入堆栈s,然后读取运算符时从堆栈中依次弹出y和x两个数字,然后以“x运算符y”的形式计算结果,然后将其压入堆栈s
·如果后缀表达式未被完全读取,则重复其面过程,堆栈顶部的最终输出值即为结束