a017. 五則運算
先乘除後加減、括號優先程式是怎麼寫的?!不知道你小時後有沒有想過這種問題,至少我是沒有啦:D
做這題要先了解堆疊,對堆疊(Stack)這種資料結構不熟的話可以看看【Ken將】電腦課小教室 - Class.Null - 堆疊與佇列
,再來了解運算式的前序、中序、後序表示法資料結構教學 : Infix 轉 Postfix
手稿
程式碼如下:
/*a017. 五則運算 * * 2020/2/28 */ import java.util.Scanner; import java.util.Stack; public class Pa017{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ System.out.println(evaluate(scanner.nextLine())); } } public static int evaluate(String s){ String[] exp = s.split(" "); Stackops = new Stack (); Stack vals = new Stack (); for(String token: exp){ if("(".equals(token)){ ops.push(token); }else if(")".equals(token)){ // 不斷計算直到遇到右括號 while(!"(".equals(ops.peek())){ vals.push(calc(vals.pop(), ops.pop(), vals.pop())); } // 把遇到的右括號pop掉 ops.pop(); }else if("+-*/%".contains(token)){ // 如果ops還有運算子 且 ops最頂層運算子的優先順序 >= token運算子的優先順序 while(!ops.isEmpty() && priority(ops.peek()) >= priority(token)){ vals.push(calc(vals.pop(), ops.pop(), vals.pop())); } ops.push(token); }else{ vals.push(Integer.parseInt(token)); } } while(!ops.isEmpty()){ vals.push(calc(vals.pop(), ops.pop(), vals.pop())); } return vals.pop(); } public static int priority(String op){ return "*/%".contains(op) ? 2 : "+-".contains(op) ? 1 : 0; } // ab位置對調 public static int calc(int b, String operator, int a){ switch(operator){ case "+": return a + b; case "-": return a - b; case "*": return a * b; case "/": return a / b; case "%": return a % b; default: System.out.println("unknown operator"); return 0; } } }
沒有留言:
張貼留言