题解 | #四则运算#
四则运算
http://www.nowcoder.com/questionTerminal/9999764a61484d819056f807d2a91f1e
liyon static boolean flag = false; public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); int num = 0; int length = s.length(); boolean flag = false; //消除() Deque<Character> stack1 = new LinkedList<>(); while(s.contains("(") && s.contains(")")){ String left = ""; String middle =""; String right =""; for (int i = 0; i < s.length(); i++) { stack1.push(s.charAt(i)); } while(!stack1.isEmpty()){ if(stack1.peek() == '(' && middle.equals("")){ stack1.pop(); middle = right; }else if(!middle.equals("")){ left = stack1.pop() + left; }else{ right = stack1.pop() + right; } } right = middle.substring(middle.indexOf(")")+1,middle.length()); middle = middle.substring(0,middle.indexOf(")")); s = left + calNum(middle) + right; } //消除[] while(s.contains("[") && s.contains("]")){ String left = ""; String middle =""; String right =""; for (int i = 0; i < s.length(); i++) { stack1.push(s.charAt(i)); } while(!stack1.isEmpty()){ if(stack1.peek() == '[' && middle.equals("")){ stack1.pop(); middle = right; }else if(!middle.equals("")){ left = stack1.pop() + left; }else{ right = stack1.pop() + right; } } right = middle.substring(middle.indexOf("]")+1,middle.length()); middle = middle.substring(0,middle.indexOf("]")); s = left + calNum(middle) + right; } //消除{} while(s.contains("{") && s.contains("}")){ String left = ""; String middle =""; String right =""; for (int i = 0; i < s.length(); i++) { stack1.push(s.charAt(i)); } while(!stack1.isEmpty()){ if(stack1.peek() == '[' && middle.equals("")){ stack1.pop(); middle = right; }else if(!middle.equals("")){ left = stack1.pop() + left; }else{ right = stack1.pop() + right; } } right = middle.substring(middle.indexOf("}")+1,middle.length()); middle = middle.substring(0,middle.indexOf("}")); s = left + calNum(middle) + right; } int res = calNum(s); if(flag) System.out.println(""); System.out.println(res); } //计算 public static int calNum(String middle){ Deque<Integer> stack = new LinkedList<>(); int num = 0; char pre = '+'; int length = middle.length(); boolean isLianXuFuHao = false; for (int i = 0; i < length; i++) { char c = middle.charAt(i); if(Character.isDigit(c)){ num = num * 10 + c -'0'; } if(num == 0 && (pre == '*' || pre =='/') && c =='-' && i>1){ isLianXuFuHao = true; continue; } if(flag) break; if (!Character.isDigit(c) && c != ' ' || i == length -1){ switch (pre){ case '+' : stack.push(num); break; case '-' : stack.push(-num); break; case '*' : if(isLianXuFuHao) { stack.push(stack.pop() * -num); isLianXuFuHao = false; }else{ stack.push(stack.pop() * num); } break; case '/' : if(isLianXuFuHao) { stack.push(stack.pop() / -num); isLianXuFuHao = false; }else{ stack.push(stack.pop() / num); } break; default: flag=true; break; } pre = c; num = 0; } } int res = 0; while(!stack.isEmpty()){ res += stack.pop(); } return res; }