题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ public static int solve(String s) { //首先定义两个栈 //操作数栈 LinkedList<Integer> numStack = new LinkedList<>(); LinkedList<Character> opsStack = new LinkedList<>(); int len = s.length(); for (int i = 0; i < len; i++) { char ch = s.charAt(i); if (ch == ' ') { continue; } //先判断一下是不是数字 if (isNumber(ch)) { //如果是数字,则需要遍历一下,看周围的数字是否遍历完成,例如26 int num = 0; while (i < len && isNumber(s.charAt(i))) { num = num * 10 + s.charAt(i) - '0'; i++; } numStack.push(num); //因为下一轮for循环自己会i++,所以这里要减去 i--; } else if (ch == '(') { //遇到左括号,直接入栈就好了 opsStack.push(ch); } else if (ch == ')') { //遇到右括号了,如果遇不到左括号就一直弹出来 while (!opsStack.isEmpty() && opsStack.peek() != '(') { Character op = opsStack.pop(); Integer a = numStack.pop(); Integer b = numStack.pop(); int r = res(op, b, a); numStack.push(r); } //弹出左括号 opsStack.pop(); } else { //如果扫描的操作符的优先级不大于栈顶的操作符,那么就弹栈 while (!opsStack.isEmpty() && priority(ch) <= priority(opsStack.peek())) { Character op = opsStack.pop(); Integer a = numStack.pop(); Integer b = numStack.pop(); int r = res(op, b, a); numStack.push(r); } //把操作符入栈 opsStack.push(ch); } } //把剩余的弹出 while (!opsStack.isEmpty()) { Character op = opsStack.pop(); Integer a = numStack.pop(); Integer b = numStack.pop(); int r = res(op, b, a); numStack.push(r); } return numStack.pop(); } //定义一下操作符和数字的运算结果 public static int res(char c, int o1, int o2) { if (c == '+') { return o1 + o2; } if (c == '-') { return o1 - o2; } if (c == '/') { return o1 / o2; } if (c == '*') { return o1 * o2; } return 0; } //判断操作数的优先级 public static int priority(char c) { if (c == '+' || c == '-') { return 1; } if (c == '*' || c == '/') { return 2; } return 0; } //首先写一个判断是不是数字 public static boolean isNumber(char c) { return c >= '0' && c <= '9'; } }