本题实现两个方法,一个是补全表达式,showString, 另一个是计算二元方程式的结果(这里条件比较苛刻,每次只能为两个元素,且必须要有右括号的情况,不然程序失效)
showString
1.原理:
定义两个堆栈,一个是保存数据的Data型,Stack<String> data =
new
Stack<>();
另一个是保存操作符的ops型,Stack<String> ops =
new
Stack<>();
对原始数据进行历遍操作:
三种情况: 1.获得为操作数,放到操作数stack
2.获得为“)”(右括号),进行判断操作:
取得两个操作数,pop两次,
取得一个操作符,pop一次,
然后添加相关的“()”左右括号,并保存到dataStack中,执行push操作。
3.直接执行psuh 到data的操作。
这里画了一个操作草图;
(自己动手一画,逻辑就清楚了)
最后就可以得到完整的表达式。
getResult
- 同样需要两个stack存贮,逻辑与上面的类似,只是将其中的一个Stack类型改为Double型,每次执行都是先提取两个操作数和一个操作符,然后判断可以执行的类型,然后将结果放回到Double型的Stack中,并作为一个Double值继续参与运算。当最后执行完成的时候,其中Double的Stack只有一个元素存在,就是最后的结果。
代码如下:
public class Example1309 {
private static void
getResult(String[] inputs){
Stack<String> ops = new Stack<>();
Stack<Double> vals = new Stack<>();
for (String input : inputs) {
//push ops
if (input.equals("+") || input.equals("-") || input.equals("*") || input.equals("/"))
{
ops.push(input);
} else if (input.equals(")")) {
if (ops.isEmpty()) {
StdOut.println("ops.isEmpty()!");
return;
}
if (vals.isEmpty()) {
StdOut.println("vals.isEmpty()");
return;
}
//
Double temp2 = vals.pop();
Double temp1 = vals.pop();
String opt = ops.pop();
Double result = 0.0;
if (opt.equals("+")) {
result = temp1 + temp2;
} else if (opt.equals("-")) {
result = temp1 - temp2;
} else if (opt.equals("*")) {
result = temp1 * temp2;
} else if (opt.equals("/")) {
result = temp1 / temp2;
} else {
StdOut.println("the option " + opt +
" is Error!");
return;
}
vals.push(result);
} else { // push vals
Double val = Double.parseDouble(input);
vals.push(val);
}
}
StdOut.println(vals.pop());
}
private static void
showString(String[] inputs){
Stack<String> ops = new Stack<>();
Stack<String> data = new Stack<>();
for (String input : inputs){
if (input.equals("+") || input.equals("-") || input.equals("*") || input.equals("/")){
ops.push(input);
}else if (input.equals(")")){
if (ops.isEmpty()){
StdOut.println("ops is Empty!");
return;
}
if (data.isEmpty()){
StdOut.println("data is Empty!");
return;
}
String data1 = data.pop();
String data2 = data.pop();
String opt = ops.pop();
data.push("(" + data2 + opt + data1 +
")");
}else {
data.push(input);
}
}
StdOut.println(data.pop());
}
public static void
main(String [] args){
String[] inputs = StdIn.readAllStrings();
//元素之间要加空格,ctrl+d结束输入
getResult(inputs);
//
showString(inputs);
}
}
运行结果图: