问题在于:
“当操作符在操作数之前写入时,表达式以前缀形式出现。 以下是前缀表达式及其评估值的一些示例:
Expression____________________Value_
12 12
+ 2 51 53
* 5 7 35
* + 16 4 + 3 1 80
以整数开头的表达式(例如12)是一个求值为自身的前缀表达式。否则,如果表达式以运算符开头并且后跟两个前缀表达式,则表达式是前缀表达式。在后一种情况下,表达式的值是从其组成前缀子表达式的值递归计算的。
编写一个允许用户在文本字段中输入前缀表达式的程序。程序读取表达式,对其进行求值,并在合适的GUI组件中显示该值。假设用户输入的表达式只使用正整数和两个运算符+和*。你的程序应该使用一个堆栈来存储子表达式的计算值,另一个堆栈来存储尚未应用的运算符。“
我无论如何都无法使用堆栈为运算符和另一个表达式来解决它。但是,使用一个堆栈并从反向执行它非常简单。
答案 0 :(得分:1)
一种解决方案是从字符串的末尾开始并将操作数放在堆栈中。每当遇到操作符时,弹出最后两个整数,应用运算符并再次推入堆栈。
import java.util.ArrayDeque;
import java.util.Deque;
public class PrefixEvaluator {
public static void main(String[] args) {
String[] prefixStr = "* + 16 4 + 3 1 ".split(" ");
Deque<Integer> stack = new ArrayDeque<>();
for(int i=prefixStr.length-1;i>-1;i--){
String s = prefixStr[i];
if(s.equals("")){
continue;
}
if(s.equals("+")){
stack.push(stack.poll()+stack.poll());
}else if(s.equals("*")){
stack.push(stack.poll() * stack.poll());
}else{
stack.push(Integer.parseInt(s));
}
}
System.out.println(stack.poll());
}
}
答案 1 :(得分:0)
它被称为Polish (or prefix) Notation,你可以找到许多例子(也用于非常相似的反向波兰表示法)和在线计算器(例如http://prefix-calc.appspot.com/)