题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNext()) { // 注意 while 处理多个 case String str = in.nextLine(); System.out.println(v(str)); } // System.out.println(sum("3/-1+2")); } private static String sum(String sub) { if (sub.startsWith("-")) { sub = "0" + sub; } Deque<String> deque = new LinkedList<>(); List<String> list = init(sub.trim()); String token = ""; for (int i = 0; i < list.size(); i++) { token = list.get(i); if (token.equals("*")) { String left = deque.pop(); String right = list.get(i + 1); token = String.valueOf(Integer.parseInt(left) * Integer.parseInt(right)); deque.push(token); i++; } else if (token.equals("/")) { String left = deque.pop(); String right = list.get(i + 1); token = String.valueOf(Integer.parseInt(left) / Integer.parseInt(right)); deque.push(token); i++; } else { deque.push(token); } } while (deque.size() > 1) { String left = deque.removeLast(); String op = deque.removeLast(); String right = deque.removeLast(); if (op.equals("+")) { token = String.valueOf(Integer.parseInt(left) + Integer.parseInt(right)); } if (op.equals("-")) { token = String.valueOf(Integer.parseInt(left) - Integer.parseInt(right)); } deque.addLast(token); } return deque.pop(); } private static List<String> init(String sub) { List<String> list = new LinkedList<>(); String val = ""; char last = 0; char ch = 0; int symbol = 1; for (int i = 0; i < sub.length(); i++) { last = ch; ch = sub.charAt(i); int num = 0; if (ch == '-') { if (last == '*' || last == '/' || last == '+' || last == '-' || last == 0) { symbol = -1; continue; } else if (Character.isDigit(last)) { } } if (Character.isDigit(ch)) { while (Character.isDigit(ch)) { num = num*10 + Integer.parseInt(ch+ ""); ++i; if (sub.length() > i) { ch = sub.charAt(i); } else { break; } } i--; ch = sub.charAt(i); val = symbol * num + ""; symbol = 1; } else { val = ch + ""; } list.add(val); } return list; } /** 9+3-5-10-2*10*(10+3+(4*1-10+5)-(9*5*1+5-7)) 2+(4*5+1)*8+7*4+10-9+3+1*9-(6-0*4*4) (7+4*3+10*(3-3+4-1-8-10)) -3+9*6*(6-10-2) -3*(-1) (3-1) 3+-1 * @param str * @return */ private static String v(String str) { String sub = ""; String re = ""; for (int i = 0; re.length() == 0; i++) { if (str.contains("(")) { int start = str.lastIndexOf("("); int end = str.indexOf(")", start); sub = str.substring(start + 1, end); String reg = "(" + sub + ")"; str = str.replace(reg, sum(sub)); } else if (str.contains("[")) { int start = str.lastIndexOf("["); int end = str.indexOf("]", start); sub = str.substring(start + 1, end); String reg = "[" + sub + "]"; str = str.replace(reg, sum(sub)); } else if (str.contains("{")) { int start = str.lastIndexOf("{"); int end = str.indexOf("}", start); sub = str.substring(start + 1, end); String reg = "{" + sub + "}"; str = str.replace(reg, sum(sub)); } else { re = sum(str); } } return re; } }