题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String line = sc.nextLine(); //给最后加一位符号,保证结束的适合能处理一次 int ans = compute(line + '-' ); System.out.println(ans); } } public static int compute(String line){ //第一步:定义好存储的变量 int n = line.length(), p = 0; Stack<Character> operators = new Stack<>();//计算符号栈 Stack<Integer> nums = new Stack<>();//操作数栈 String numStr = ""; //第二步:循环处理传入的字符串 while(p < n){ char c = line.charAt(p); if(Character.isDigit(c)){ //1、如果遍历到的字符是数字,则将字符加入到数字字符串中 numStr += c; }else{ //2、如果遍历到的字符不是数字,那么就先处理一下数字字符串 if(numStr.length()>0){//如果数字字符串不为空,就像操作数栈中压栈 nums.push(Integer.valueOf(numStr)); numStr = ""; } //接着处理当前的字符,字符的情况有四种 //情况一:字符是加减 if(c == '+' || c == '-'){ //此时 减号 表示负号,则特殊处理一下 if(c == '-' && ( p==0 || line.charAt(p-1) == '(' ) ){ numStr = "-"; p++; continue; } while(!operators.isEmpty() && (operators.peek() == '*' || operators.peek() == '/' || operators.peek() == '+' || operators.peek() == '-')){ char top = operators.pop(); int num2 = nums.pop(); int num1 = nums.pop(); nums.push(doCompute(top, num1, num2)); } operators.push(c); } //情况二:字符是乘除,直接入栈 else if(c == '*' || c == '/'){ operators.push(c); } //情况三:字符是左括号,直接入栈 else if(c == '('){ operators.push(c); } //情况四:字符是右括号,处理直到匹配到左括号 else if(c == ')'){ while(operators.peek() != '('){ char top = operators.pop(); int num2 = nums.pop(); int num1 = nums.pop(); nums.push(doCompute(top, num1, num2)); } //注意!情况四处理完需要把左括号弹出来 operators.pop(); } } //处理完后看下一位 p++; } //第三步:把结果数据返回 return nums.peek(); } //计算的方法 public static int doCompute(char op,int num1, int num2){ switch(op){ case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': return num1 / num2; } return 0; } }