本题实现两个方法,一个是补全表达式,
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)
;
}
}
运行结果图: