import java.util.Scanner;
import java.util.Stack;
public class Dijkstra {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String s = scanner.nextLine();
//先定义两个栈,一个存放数字一个存放符号
Stack<String> ops= new Stack<>();
Stack<Double> doubles = new Stack<>();
//判断元素是什么做出不同操作
for (int i=0;i<s.length();i++){
char c=s.charAt(i);
String s1=String.valueOf(c);
if ("(".equals(s1));
else if ("+".equals(s1)) ops.push(s1);
else if ("-".equals(s1)) ops.push(s1);
else if ("*".equals(s1)) ops.push(s1);
else if ("/".equals(s1)) ops.push(s1);
else if (")".equals(s1)){
//对右括号左边的两数进行运算
String ops1 = ops.pop();
Double aDouble = doubles.pop();
//if ("-".equals(ops1)) aDouble=aDouble-doubles.pop(); !!!
//先进后出,aDouble是被减数
if ("-".equals(ops1)) aDouble=doubles.pop()-aDouble;
else if("+".equals(ops1)) aDouble=aDouble+doubles.pop();
else if("*".equals(ops1)) aDouble=aDouble*doubles.pop();
else if("/".equals(ops1)) aDouble=aDouble/doubles.pop();
//将运算结果压入数字栈
doubles.push(aDouble);
}
//将字符串的数字转型为Double类型压入数字栈
else doubles.push(Double.parseDouble(s1));
}
System.out.println(doubles.pop());
}
}
代码如上,此算法主要思想为当s1为运算符时压入符号栈,当s1为数字时压入数字栈,当s1为左括号时忽略(此处注意,如果直接忽略左括号不写的话会导致直接进入最后的else判断,导致Double.parseDouble(s1)转型失败),当s1为右括号时对数字栈最上面的两个数进行符号栈最上面的符号进行运算,这些数据全部取自Stack的pop方法(删除元素并返回元素的值),运行结果如下