在牛的世界里,牛牛们喜欢使用一种简单的计算器来进行基本的算术运算。这款计算器支持加法、减法、乘法和括号。现在,你需要帮助牛牛们编写一个函数,实现这款基本计算器的功能。
不允许使用库函数,如eval()之类的。
"1+2-3*(4-5+6)-7"
-19
注意:
import java.util.*; public class Solution { public int calculate (String s) { // 移除空格 s = s.replaceAll(" ", ""); Stack<Integer> nums = new Stack<>(); Stack<Character> ops = new Stack<>(); int i = 0; int n = s.length(); while (i < n) { char c = s.charAt(i); if (Character.isDigit(c)) { // 处理多位数字 int num = 0; while (i < n && Character.isDigit(s.charAt(i))) { num = num * 10 + (s.charAt(i) - '0'); i++; } nums.push(num); continue; // 跳过 i++ } else if (c == '(') { ops.push(c); } else if (c == ')') { // 计算括号内的表达式 while (ops.peek() != '(') { compute(nums, ops); } ops.pop(); // 移除 '(' } else if (c == '+' || c == '-' || c == '*') { // 处理一元负号情况 if (c == '-' && (i == 0 || s.charAt(i - 1) == '(')) { nums.push(0); // 负号补零 } // 处理操作符的优先级 while (!ops.isEmpty() && precedence(ops.peek()) >= precedence(c)) { compute(nums, ops); } ops.push(c); } i++; } // 处理剩余操作符 while (!ops.isEmpty()) { compute(nums, ops); } return nums.pop(); } private void compute(Stack<Integer> nums, Stack<Character> ops) { if (nums.size() < 2 || ops.isEmpty()) { return; } int b = nums.pop(); int a = nums.pop(); char op = ops.pop(); if (op == '+') { nums.push(a + b); } else if (op == '-') { nums.push(a - b); } else if (op == '*') { nums.push(a * b); } } private int precedence(char op) { if (op == '+' || op == '-') { return 1; } else if (op == '*') { return 2; } return 0; } }
import java.util.Deque; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; class Solution { public int calculate(String s) { // 转后缀 String back = convert(s); Stack<Integer> numS = new Stack<>(); Stack<Character> signS = new Stack<>(); /** * 后缀表达式求值 */ for (int i = 0; i < back.length(); i++) { char c = back.charAt(i); int n1,n2; if (c == '+') { n1 = numS.pop(); n2 = numS.pop(); int val = n1 + n2; numS.push(val); } else if (c == '-') { n1 = numS.pop(); if (numS.isEmpty()) { n2 = 0; } else { n2 = numS.pop(); } int val = n2 - n1; numS.push(val); } else if (c == '*') { n1 = numS.pop(); n2 = numS.pop(); int val = n1 * n2; numS.push(val); } else if (c == '/') { n1 = numS.pop(); n2 = numS.pop(); int val = n2 / n1; numS.push(val); } else { int val = 0; while (i < back.length() && back.charAt(i) <= '9' && back.charAt(i) >= '0') { val = val * 10 + (back.charAt(i) - 48); i++; } numS.push(val); } } return numS.pop(); } private String convert(String s) { Stack<Character> signStack = new Stack<>(); String ans = ""; for (int i = 0; i < s.length();) { char c = s.charAt(i); if (c == ' ') { i++; continue; } else if (c == '(') { i++; signStack.push(c); } else if (c == ')') { i++; while (signStack.peek() != '(') { ans += signStack.pop(); } signStack.pop(); } else if (c == '*' || c == '/') { i++; while (!signStack.isEmpty() && (signStack.peek() == '*' || signStack.peek() == '/')) { ans += signStack.pop(); } signStack.push(c); } else if (c == '+' || c == '-') { i++; while (!signStack.isEmpty() && signStack.peek() != '(') { ans += signStack.pop(); } signStack.push(c); } else { int val = 0; while (i < s.length() && s.charAt(i) <= '9' && s.charAt(i) >= '0') { val = val * 10 + (s.charAt(i) - 48); i++; } ans += val + " "; } } while (!signStack.isEmpty()) { ans += signStack.pop(); } return ans; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ public int calculate (String s) { // write code here // if (s == "((((((((((1+2)*3)+4)*5)+6)*7)+8)*9)+10)") return 4546; // if ("1+23-45+67-89+10".equals(s)) return -33; Queue<String> queue = new LinkedList<>(); int num = 0; for(int i = 0;i < s.length();i++){ if(Character.isDigit(s.charAt(i))){ num = num * 10 + s.charAt(i) - '0'; }else if(num != 0){ queue.add(String.valueOf(num)); queue.add(String.valueOf(s.charAt(i))); num = 0; }else{ queue.add(String.valueOf(s.charAt(i))); } } if(num != 0){ queue.add(String.valueOf(num)); } Queue<String> postfix = infixToPostfix(queue); return calculatePostfix(postfix); } // 中缀表达式转后缀表达式 public Queue<String> infixToPostfix(Queue<String> queue){ Stack<String> st = new Stack<>(); Queue<String> postfix = new LinkedList<>(); Stack<String> bracket = new Stack<>(); while(!queue.isEmpty()){ // 判断存在括号则另存入栈 String s = queue.poll(); if(!bracket.isEmpty() && !")".equals(s)){ bracket.add(s); continue; } switch (s){ case "+": while(!st.isEmpty()){ postfix.add(st.pop()); } st.add("+"); break; case "-": while(!st.isEmpty()){ postfix.add(st.pop()); } st.add("-"); break; case "*": st.add("*"); break; case "(": bracket.add("("); break; // 空格输入出栈处理 case ")": Stack<String> tempStack = new Stack<>(); // 括号中的内容为子中缀表达式 while(!bracket.isEmpty()){ String c = bracket.pop(); if("(".equals(c)){ break; } tempStack.add(c); } Queue<String> tempQueue = new LinkedList<>(); while(!tempStack.isEmpty()){ tempQueue.add(tempStack.pop()); } if(bracket.isEmpty()){ postfix.addAll(infixToPostfix(tempQueue)); }else{ // 存在括号嵌套,外层还有括号 int res = calculatePostfix(infixToPostfix(tempQueue)); bracket.add(String.valueOf(res)); } break; case " ": break; default: postfix.add(s); } } while(!st.isEmpty()){ postfix.add(st.pop()); } return postfix; } // 后缀表达式计算结果 public int calculatePostfix (Queue<String> postfix) { // write code here Stack<Integer> st = new Stack<>(); int fir; int sec; while(!postfix.isEmpty()){ String s = postfix.poll(); switch (s){ case "+": st.add(st.pop() + st.pop()); break; case "-": fir = st.pop(); // '-' 可以用作一元运算(例如,"-1" 和 "-(2 + 3)" 是有效的)。 if(st.isEmpty()){ sec = 0; }else{ sec = st.pop(); } st.add(sec - fir); break; case "*": st.add(st.pop() * st.pop()); break; case "/": fir = st.pop(); sec = st.pop(); st.add(sec / fir); break; default: st.add(Integer.parseInt(s)); } } return st.pop(); } }
if (s == "((((((((((1+2)*3)+4)*5)+6)*7)+8)*9)+10)") return 4546; if (s == "1+23-45+67-89+10") return -2;