20130724【Java】逆ポーランド記法を解く

お題

逆ポーランド記法を解く

 

ソース

import java.io.*;

public class List12_1 {
 static class Bunsuu {
  public final int bunbo;
  public final int bunsi;
  
  Bunsuu(int bunbo, int bunsi) {
   this.bunbo = bunbo;
   this.bunsi = bunsi;
   if(bunbo == 0) {
    throw(new RuntimeException("0で除算しました"));
   }
  }
 }
 
 private static Bunsuu stack = new Bunsuu[10];
 private static int stackTop = 0;
 
 private static void stackPush(Bunsuu val){
  stack[stackTop++] = val;
 }
 
 private static Bunsuu stackPop() {
  return stack[--stackTop];
 }
 
 public static void main(String
args) {
  System.out.print("逆ポーランド記法で数式を入力してください:");
  String line = stringReader();
  int c = 0;
  while(c != line.length()) {
   char ch = line.charAt(c);
   if(Character.isDigit(ch)) stackPush(new Bunsuu(1, Character.digit(ch, 10)));
   else {
    Bunsuu st1 = stackPop();
    Bunsuu st2 = stackPop();
    switch(ch) {
    case '+':
     stackPush(new Bunsuu(st1.bunbo * st2.bunbo,
       st2.bunsi * st1.bunbo
        +st1.bunsi * st2.bunbo));
     break;
    case '-':
     stackPush(new Bunsuu(st1.bunbo * st2.bunbo,
       st2.bunsi * st1.bunbo
        - st1.bunsi * st2.bunbo));
     break;
    case '*':
     stackPush(new Bunsuu(st1.bunbo * st2.bunbo
       ,st2.bunsi * st1.bunsi));
     break;
    case '/':
     stackPush(new Bunsuu(st2.bunbo * st1.bunsi,
       st2.bunsi * st1.bunbo));
     break;
    default:
     System.out.println("無効な数字が入っています");
     return;
    }
   }
   c++;
  }
  Bunsuu st1 = stackPop();
  if(stackTop != 0){
   System.err.println("正しくない数式です。数字が多すぎます。");
   return;
  }
  System.out.println("解は" + *1;
   String str = br.readLine();
   return str;
  } catch(Exception e) {
   System.out.println("IOError");
   return "";
  }
 }

}

実行結果

逆ポーランド記法で数式を入力してください:5831+/*
解は10.0です

*1:double)st1.bunsi) /
        ((double)st1.bunbo) + "です");
 }
 
 private static String stringReader(){
  try{
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in