題解 | #四則運算#
四則運算
http://www.fangfengwang8.cn/practice/9999764a61484d819056f807d2a91f1e
import java.util.Deque; import java.util.LinkedList; import java.util.Scanner; // 注意類名必須為 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的區(qū)別 while (in.hasNextLine()) { // 注意 while 處理多個 case String s = in.nextLine(); s = s.replace('[', '('); s = s.replace('{', '('); s = s.replace(']', ')'); s = s.replace('}', ')'); //System.out.println(s); Deque<Integer> numbers = new LinkedList<>(); Deque<Character> operators = new LinkedList<>(); int n = s.length(); //變換表達式形式 有0的情況3+2*{1+2*[(0-4)/(8-6)+7]} StringBuffer ss = new StringBuffer(); for (int i = 0 ; i < n ; ++i) { if (s.charAt(i) == '-') { if (i == 0 || s.charAt(i - 1) == '(') { ss.append("(0-"); ++i; if (s.charAt(i) == '(') { //這里應該再做一些處理,比如說-((3*2)-1))的情況,這里可以對括號進行計數(shù),然后遇到最終的)才返回,但是這里用例情況沒有考慮 while (s.charAt(i) != ')') { ss.append(s.charAt(i)); ++i; } ss.append(')'); } else { while(i < n && s.charAt(i) >= '0' && s.charAt(i) <= '9'){ ss.append(s.charAt(i)); ++i; } ss.append(')'); --i; } } else{ ss.append('-'); } } else{ ss.append(s.charAt(i)); } } //System.out.println(ss.toString()); s = ss.toString(); n=s.length(); for (int i = 0 ; i < n ; ++i) { StringBuffer sb = new StringBuffer(); while (i < n && s.charAt(i) >= '0' && s.charAt(i) <= '9') { sb.append(s.charAt(i)); ++i; //System.out.println(s.charAt(i)); } //System.out.println(sb.toString()); if (sb.length() > 0) { numbers.push(Integer.valueOf(sb.toString())); } if (i < n) { char op = s.charAt(i); if (op == '(') { operators.push(op); } else if (op == '+' || op == '-') { if (operators.isEmpty()) { operators.push(op); continue; } char opPeak = operators.peek(); while (!operators.isEmpty() && operators.peek() != '(') { int a = numbers.pop(); int b = numbers.pop(); if (opPeak == '*') { numbers.push(a * b); } if (opPeak == '/') { numbers.push(b / a); } if (opPeak == '+') { numbers.push(b + a); } if (opPeak == '-') { numbers.push(b - a); } operators.pop(); if (operators.isEmpty()) { break; } opPeak = operators.peek(); } operators.push(op); } else if (op == '*' || op == '/') { operators.push(op); } else { while (operators.peek() != '(') { char opPeak = operators.pop(); int a = numbers.pop(); int b = numbers.pop(); //System.out.println(a+" "+b); //System.out.println(numbers); //System.out.println(operators); if (opPeak == '+') { numbers.push(a + b); } else if (opPeak == '-') { numbers.push(b - a); } else if (opPeak == '*') { numbers.push(a * b); } else { numbers.push(b / a); } } operators.pop(); //把左括號出棧 } } } while (!operators.isEmpty()) { int a = numbers.pop(); int b = numbers.pop(); char op = operators.pop(); if (op == '+') { numbers.push(a + b); } else if (op == '-') { numbers.push(b - a); } else if (op == '*') { numbers.push(a * b); } else { numbers.push(b / a); } } System.out.println(numbers.peek()); } } }