题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ public int solve (String s) { Stack<Integer> stack = new Stack<>(); for ( int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '(') { stack.push(i); } } if (stack.isEmpty()) { return computeResult(s); } StringBuilder builder = new StringBuilder(s); while (!stack.isEmpty()) { Integer pop = stack.pop(); int index = pop; int indexOf = builder.indexOf(")", index); String substring = builder.substring(index + 1, indexOf); if (substring.length() > 0) { int compute = computeResult(substring); builder.replace(index, indexOf + 1, compute + ""); } else { builder.replace(index + 1, indexOf, substring); } } return computeResult(builder.toString()); } public int computeResult(String s) { List<Object> arr = new ArrayList<>(); compute(s, 0, arr); Integer res = null; Character reg = null; for (Object ite : arr) { if (ite instanceof Integer) { if (reg == null) { res = (Integer) ite; } else { if ('-' == reg) { res = res - (Integer) ite; } else { res = res + (Integer) ite; } } } if (ite instanceof Character) { reg = (Character) ite; } } return res; } public void compute (String s, int index, List<Object> arr) { int curri = index; StringBuilder numpar = new StringBuilder(); List<Character> regres = new ArrayList<Character>() { { add('+'); add('-'); add('*'); } }; while ( curri < s.length() && (!regres.contains(s.charAt(curri)) || ('-' == s.charAt(curri) && (curri == 0)) || regres.contains(s.charAt(curri - 1)) )) { numpar.append(s.charAt(curri)); curri++; } int i = Integer.parseInt(numpar.toString()); if (curri >= s.length() - 1) { arr.add(i); return; } if ('*' == s.charAt(curri)) { while (curri < s.length() && '*' == s.charAt(curri)) { numpar = new StringBuilder(); curri++; while ( curri < s.length() && (!regres.contains(s.charAt(curri)) || ('-' == s.charAt(curri) && numpar.length() == 0))) { numpar.append(s.charAt(curri)); curri++; } i = i * Integer.parseInt(numpar.toString()); } if (curri >= s.length() - 1) { arr.add(i); return; } if ('+' == s.charAt(curri)) { arr.add(i); arr.add('+'); compute(s, ++curri, arr); } else { arr.add(i); arr.add('-'); compute(s, ++curri, arr); } } else { if ('+' == s.charAt(curri)) { arr.add(i); arr.add('+'); compute(s, ++curri, arr); } else { arr.add(i); arr.add('-'); compute(s, ++curri, arr); } } } }