偶然翻书看到这个算法,感觉很有意思,就姑且简单实现了一下。代码如下
package com.syh.algorithm;
import java.util.Scanner;
import java.util.Stack;
public class Evaluate {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();
while(!(scanner.hasNext("end"))){
String string = scanner.next();
if(string.equals("("));
else if(string.equals("+")||string.equals("-")||string.equals("/")||
string.equals("*"))
ops.push(string);
else if(string.equals(")")){
String s = ops.pop();
Double v = vals.pop();
if(s.equals("+")) v = vals.pop() + v;
else if(s.equals("-")) v = vals.pop() - v;
else if(s.equals("/")) v = vals.pop() / v;
else if(s.equals("*")) v = vals.pop() * v;
vals.push(v);
}
else
vals.push(Double.parseDouble(string));
}
System.out.println(vals.pop());
scanner.close();
}
}
很无奈的发现一个问题,Scanner.hasNext()方法并不是空值返回false!而是阻!塞!,对,如果数据源用的system.in的话它是会阻塞的。无奈我尝试了使用条件!Scanner.hasNext("\n"),!Scanner.hasNext("\r")却都不能识别出回车或者换行,然后又尝试了!Scanner.hasNext("end"),在输入最后添加一个end就能够跳出循环,这个问题我表示很无奈,如果有朋友知道为什么不能识别出回车和换行符的请不吝指教一下。
感觉这样在末尾加end很别扭(对,我就是强迫症),故把程序改成了下面这样:
package com.syh.algorithm;
import java.util.Scanner;
import java.util.Stack;
public class Evaluate {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();
if(scanner.hasNextLine()){
String[] ss = scanner.nextLine().split(" ");
for(String string : ss){
if(string.equals("("));
else if(string.equals("+")||string.equals("-")||string.equals("/")||
string.equals("*"))
ops.push(string);
else if(string.equals(")")){
String s = ops.pop();
Double v = vals.pop();
if(s.equals("+")) v = vals.pop() + v;
else if(s.equals("-")) v = vals.pop() - v;
else if(s.equals("/")) v = vals.pop() / v;
else if(s.equals("*")) v = vals.pop() * v;
vals.push(v);
}
else
vals.push(Double.parseDouble(string));
}
}
System.out.println(vals.pop());
scanner.close();
}
}
由于只是简单实现就必须在每个计算两边加上括号了(有几个括号就进行几次计算)。