什么是波兰表达式 早在1920年,波兰科学家扬·武卡谢维奇就发明了一种不需要括号的表示法,可以用来表示一个计算表达式。即将操作符号写在操作数之前,也就是前缀表达式,即波兰式(Polish Notation, PN)。这种表达式直到1960年计算机出现后才发挥出其威力 比如2 + 3 * (5 - 1)这个表达式的前缀表达式为+ 2 * 3 - 5 1来表示。 可以看到,这种计算过程也相当复杂,需要多次遍历表达式,而且需要识别一个操作符后面跟着两个操作数这种模式,相比而言,下文中的逆波兰式要更为直接和简单。 什么是逆波兰表达式 即后缀表达式,更加广为人知一些,和前缀表达式刚好相反,是将操作符号放置于操作数之后 比如2 + 3 * (5 - 1)用逆波兰式来表示则是:2 3 5 1 - * +。 上面这个步骤可以很容易的用栈来实现: 实现: ![]() ![]() //计算后缀表达式 public static int calculateHouzhui(List<String> list){ Stack<String> s=new Stack<String>(); for(String ob:list){ if(!operator.contains(ob)){ s.add(ob); }else{ String b=s.pop(); String a=s.pop(); String value=calculate(a, b, ob)+""; s.add(value); } } return Integer.parseInt(s.pop()); } public static int calculate(String a,String b,String operator){ int aa=Integer.parseInt(a); int bb=Integer.parseInt(b); if(operator.equals("+")){ return aa+bb; }else if(operator.equals("-")){ return aa-bb; }else if(operator.equals("*")){ return aa*bb; }else if(operator.equals("/")){ return aa/bb; } return 0; } 中缀表达式转换为后缀表达式 (1)当读到数字直接送至输出队列中 后缀表达式转中缀表达式 思路:和计算后缀表达式类似。从左往右依次读取表达式,如果是数字则将该数字压栈,如果是符号,则将之前的两个数字出栈,拼接符号,并压栈,记录该符号栈,压栈之前与之前记录的操作符做比较。如果当前操作符大于记录值。则栈中表达式 需要加括号
|
|
来自: 新用户1182rNZ4 > 《待分类》