for (inti=0; i < s.length(); i++) { charc= s.charAt(i); if (Character.isDigit(c)) { intnum=0; while (i < s.length() && Character.isDigit(s.charAt(i))) { num = num * 10 + (s.charAt(i) - '0'); i++; } // i == s.length() or s[i] is not digit i--; numStack.push(num); } else { // 补 0,将 -1 转换为 0-1 这样的二元运算表达式 if (c == '-' && i == 0) { numStack.push(0); }
// 注意此处是 while 而不是 if, 可以用 "1*2-3/4+5*6-7*8+9/10" 进行验证,即保证从左到右计算,若使用 if 会导致乘除法计算的结果全部位于栈中,最后 "2-0+30-56+0" 从右到左计算而得到错误结果。while 的另一层含义为使操作符栈中的操作符优先级递增,以保证最后 while 计算结果正确 while (!operatorStack.isEmpty() && OPERATOR_TO_PRECEDENCE_MAP.get(operatorStack.peek()) >= OPERATOR_TO_PRECEDENCE_MAP.get(c)) { calc(numStack, operatorStack); } operatorStack.push(c); } }