中缀表达式转后缀表达式(逆波兰式)
中缀表达式:
我们平时写的数学表达式一般为中缀表达式,如“5+2*(3*(3-1*2+1))”,直接拿中缀表达式直接让计算机计算表达式的结果并不能做到。
后缀表达式:
把中缀表达表达式“5+2*(3*(3-12+1))”转化“523312-1+**+”这样的形式,就是后缀表达式。这种记法叫做后缀(postfix)或逆波兰(reverse Polish)记法。计算这个问题最容易的方法就是使用一个栈。
实现思路
只适用简单的加减乘除带括号
为了便于理解 ,定义了操作数和运算符
初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。
从左到右处理各个元素,直到末尾。可能遇到三种情况:
① 遇到操作数。直接加入后缀表达式。
② 遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式,直到
弹出“(”为止。注意:“(”不加入后缀表达式。
③ 遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,
若碰到“(” 或栈空则停止。之后再把当前运算符入栈。
按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。
实现代码
import java.util.Scanner;
import java.util.Stack;
public class 后缀表达式 {
static String houzhui(String Biaoda) {
String number = "";
Stack<String> fu = new Stack<String>();
for (int i = 0; i <Biaoda.length() ; i++) {
String temp = String.valueOf(Biaoda.charAt(i));
if (temp.equals("+")|| temp.equals("-")) {
while (!fu.isEmpty()){
if (fu.peek().equals("(")) break;
number += fu.pop();
}
fu.push(temp);
}else if (temp.equals("*")||temp.equals("/")) {
while (!fu.isEmpty()){
String aa = fu.peek();
if (aa.equals("(")) break;
if (aa.equals("+") || aa.equals("-")) break;
number += fu.pop();
}
fu.push(temp);
}else if(temp.equals("(")){
//扫描到"(" 直接入栈
fu.push(temp);
}else if(temp.equals(")")) {
while (!fu.isEmpty()){
String tempF = fu.pop();
if (tempF.equals("(")) break;
number += tempF;
}
}else {
//扫描到操作数直接加入后缀表达式 即 加入操作数栈
number += temp;
}
}
//符号栈中依次出栈加入后缀表达式
while (!fu.isEmpty()) number+=fu.pop();
return number;
}
public static void main(String[] args) {
System.out.println(houzhui("A+B*(C-D)-E/F"));
}
}
运行结果
ABCD-*+EF/-
Process finished with exit code 0
以上只实现了后缀表达式的字符转换,不足之处望指正。