题解 | #牛牛计算器#
牛牛计算器
https://www.nowcoder.com/practice/192ac31d5e054abcaa10b72d9b01cace?tpId=354&tqId=10590517&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ public int calculate (String s) { // write code here Stack<Integer> stack = new Stack<Integer>(); int num = 0; char operation = '+'; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (!Character.isWhitespace(c)) { if (c >= '0' && c <= '9') { num = num * 10 + c - '0'; } else if (c == '(') { int j = i, cnt = 0; for (; i < s.length(); i++) { if (s.charAt(i) == '(') cnt++; if (s.charAt(i) == ')') cnt--; if (cnt == 0) { break; } } num = calculate(s.substring(j + 1, i)); } else { // 遇到符号了 if (operation == '+') { stack.push(num); } else if (operation == '-') { stack.push(-num); } else if (operation == '*') { int tmp = stack.pop() * num; stack.push(tmp); } num = 0; operation = c; } if (i == s.length() - 1) { // 到达了计算的额字符串的末尾,将最后一个数字压入栈中 if (operation == '+') { stack.push(num); } else if (operation == '-') { stack.push(-num); } else if (operation == '*') { int tmp = stack.pop() * num; stack.push(tmp); } } } else { if (i == s.length() - 1) { // 到达了计算的额字符串的末尾,将最后一个数字压入栈中 if (operation == '+') { stack.push(num); } else if (operation == '-') { stack.push(-num); } else if (operation == '*') { int tmp = stack.pop() * num; stack.push(tmp); } } } } int result = 0; while (!stack.isEmpty()) { result += stack.pop(); } return result; } // " 3 - 2 * 4 " // -5 // "(((((((((1+2)*3)+4)*5)+6)*7)+8)*9)+10)" // 4555 }
在表达式有效的前提下,计算字符串表达式的值
在刚开始取到的字符一定是数字或左括号之中的一种情况。
我们先讨论是数字的情况,如果开始的是数字字符,继续向后寻找,如果找到的还是数字,将前面的数字乘以10加上本次找到的数字,一直遇到数字就一直往下加拼凑,直到遇到符号或括号(说明本次数字找完整了),根据上一个遇到的符号把数字添加到栈中,
- 如果上一个是加号,直接加入到栈中,
- 如果上一个是减号,把其相反数放入栈中(旨在最后做出一个全是加法的表达),
- 如果上一个是乘号,那么把栈顶元素弹出和本次相乘再加到栈中(旨在最后做出一个全是加法的表达)
最后把上一个操作符更新为本次的操作符,继续往下执行。
在末尾,处理栈中所有的元素,全部相加就是最后的结果
如果遇到的是括号,找到下一个成对的括号,然后把这段表达式放到函数中递归。
#java##栈##字符串匹配(正则表达式)#