#8437: [JAVA] 怎麼會RE


pomelo4068 (小柚)

學校 : 不指定學校
編號 : 32940
來源 : [59.115.168.109]
最後登入時間 :
2017-06-06 17:36:04
a017. 五則運算 | From: [114.36.102.42] | 發表日期 : 2013-12-09 21:16

 

  1. import java.util.Scanner;
  2. import java.util.Stack;
  3. public class JAVA {
  4. /**
  5. * @param args
  6. */
  7. public static void main(String[] args) {
  8. Scanner scan = new Scanner(System.in);
  9. while (scan.hasNext()) {
  10. String str = scan.nextLine();
  11. String s[] = str.split(" ");
  12. char c[] = new char[s.length];
  13. /*
  14. * String陣列 s[] 轉成char 陣列 c[] 使用char 而不用String 是因為 char
  15. * 有isDigit方法可以判斷是否是數字 ,比較方便
  16. */
  17. for (int i = 0; i < s.length; i++) {
  18. c[i] = s[i].charAt(0);
  19. }
  20. // System.out.print(ChangetoPostfix(c));
  21. System.out.println(ChangeToInfix(ChangetoPostfix(c)));
  22. }
  23. }
  24. static char[] ChangetoPostfix(char c[]) {
  25. StringBuffer sb = new StringBuffer();
  26. Stack<Character> stack = new Stack<Character>();
  27. char op;
  28. for (int i = 0; i < c.length; i++) {
  29. op = c[i];
  30. // 如果是運算子
  31. if (Character.isDigit(op))
  32. sb.append(op);
  33. else if (op == '(') {
  34. stack.push(op);
  35. } else if (op == ')') { // 遇到 ) 時,若stack.peek()的不是 ( ,就一直pop()出來
  36. while (stack.peek() != '(') { // stack.peek():傳回Top的值 ,而不移除他
  37. sb.append(stack.pop());
  38. }
  39. stack.pop(); // 拿出 (
  40. }
  41. else {
  42. while (true) {
  43. if (stack.empty()) {
  44. stack.push(op);
  45. break;
  46. } else {
  47. if (getPriority(op) <= getPriority(stack.peek())) {
  48. sb.append(stack.pop()); // 如果輸入的優先序小於stack.peek()就pop
  49. } else {
  50. stack.push(op);
  51. break;
  52. }
  53. }
  54. }
  55. }
  56. }
  57. while (!stack.empty()) { // 將剩下在堆疊裡的element都拿出來
  58. sb.append(stack.pop());
  59. }
  60. return sb.toString().toCharArray();
  61. }
  62. static int getPriority(char c) { // 取得運算子優先序
  63. switch (c) {
  64. case '+':
  65. case '-':
  66. return 1;
  67. case '*':
  68. case '/':
  69. case '%':
  70. return 2;
  71. default: // 非運算子回傳0
  72. return 0;
  73. }
  74. }
  75. static int ChangeToInfix(char p[]) {
  76. Stack<Integer> stack = new Stack<Integer>();
  77. char token;
  78. for (int i = 0; i < p.length; i++) {
  79. token = p[i];
  80. if (Character.isDigit(token)) {
  81. stack.push(Integer.parseInt(String.valueOf(p[i])));
  82. } else {
  83. stack.push(getCal(stack.pop(), stack.pop(), token));
  84. }
  85. }
  86. return stack.pop();
  87. }
  88. static int getCal(int i2, int i1, char token) {
  89. switch (token) {
  90. case '+':
  91. return i1 + i2;
  92. case '-':
  93. return i1 - i2;
  94. case '*':
  95. return i1 * i2;
  96. case '/':
  97. return i1 / i2;
  98. case '%':
  99. return i2 % i1;
  100. }
  101. return 0;
  102. }
  103. }

 

 

自己測試答案都正確

但是怎麼會測出RE 呢

求解 

 

 
#9158: Re:[JAVA] 怎麼會RE


iloveyou2 (阿蠻悲歌)

學校 : 不指定學校
編號 : 41543
來源 : [114.46.204.225]
最後登入時間 :
2021-06-01 12:00:09
a017. 五則運算 | From: [114.41.0.155] | 發表日期 : 2014-09-06 09:21

我不確定是不是跟你的switch後面沒有加break;有關,可能用debug看一下數值變化。

 
#9159: Re:[JAVA] 怎麼會RE


iloveyou2 (阿蠻悲歌)

學校 : 不指定學校
編號 : 41543
來源 : [114.46.204.225]
最後登入時間 :
2021-06-01 12:00:09
a017. 五則運算 | From: [114.41.0.155] | 發表日期 : 2014-09-06 09:21

我不確定是不是跟你的switch後面沒有加break;有關,可能用debug看一下數值變化。

 
#9160: Re:[JAVA] 怎麼會RE


iloveyou2 (阿蠻悲歌)

學校 : 不指定學校
編號 : 41543
來源 : [114.46.204.225]
最後登入時間 :
2021-06-01 12:00:09
a017. 五則運算 | From: [114.41.0.155] | 發表日期 : 2014-09-06 09:21

我不確定是不是跟你的switch後面沒有加break;有關,可能用debug看一下數值變化。

 
#9161: Re:[JAVA] 怎麼會RE


iloveyou2 (阿蠻悲歌)

學校 : 不指定學校
編號 : 41543
來源 : [114.46.204.225]
最後登入時間 :
2021-06-01 12:00:09
a017. 五則運算 | From: [114.41.0.155] | 發表日期 : 2014-09-06 09:21

我不確定是不是跟你的switch後面沒有加break;有關,可能用debug看一下數值變化。

 
#9162: Re:[JAVA] 怎麼會RE


iloveyou2 (阿蠻悲歌)

學校 : 不指定學校
編號 : 41543
來源 : [114.46.204.225]
最後登入時間 :
2021-06-01 12:00:09
a017. 五則運算 | From: [114.41.0.155] | 發表日期 : 2014-09-06 09:22

我不確定是不是跟你的switch後面沒有加break;有關,可能用debug看一下數值變化。

 
#9189: Re:[JAVA] 怎麼會RE


ak5612599 (魂o小草)

學校 : 明新科技大學
編號 : 35696
來源 : [175.98.144.194]
最後登入時間 :
2023-02-24 11:16:37
a017. 五則運算 | From: [120.105.96.200] | 發表日期 : 2014-09-15 22:13

我覺得可能是遇到這種情況造成RE!!

3 /  0 <- 像這個 java執行就會出錯。 


 
ZeroJudge Forum