Problem:
未熟者の数式

博士 : ピーター君、ついにやったよ。

ピーター : またですか。今度はどんなくだらない発明ですか。

博士 : ついに数式を計算機で処理する画期的な方法を思いついたんだ。この表をみてごらん。

通常の記法

博士の「画期的な」記法

1 + 2

1 2 +

3 * 4 + 7

3 4 * 7 +

10 / ( 2 - 12 )

10 2 12 - /

( 3 - 4 ) * ( 7 + 2 * 3 )

3 4 - 7 2 3 * + *

ピーター : はぁ。

博士 : ふっふっふ。これだけでは、未熟者の君には何のことだかわからないだろうねえ。ここからが肝心なんじゃ。

ピーター : っていうか・・・。

博士 : 計算機にはスタックというデータ構造があることは君も知っているね。ほれ、「先入れ後出し」のあれじゃよ。

ピーター : はい。知ってますが、あの・・・。

博士 : この画期的な記法はあのスタックを使うんじゃ。例えばこの 10 2 12 - / だが、次のように処理する。

処理対象

10

2

12

-

/

↓

↓

↓

↓2-12

↓10/-10

スタック

.

.

10

.

2

10

12

2

10

.

-10

10

.

.

-1

博士 : どうじゃな。括弧も演算子の優先順位も気にする必要がないじゃろう？語順も「10 を 2 から 12 を引いたもので割る。」となり、何となく彼の極東の島国の言葉、日本語と似ておるじゃろうて。
この画期的な発明さえあれば、我が研究室は安泰じゃて。ファファファ。

ピーター : っていうか博士。これって日本にいたとき会津大学の基礎コースで習いましたよ。「逆ポーランド記法」とかいって、みんな簡単にプログラムしてました。

博士 : ・・・。

ということで、ピーター君に変わって博士に、このプログラムを教える事になりました。「逆ポーランド記法」で書かれた数式を入力とし、計算結果を出力するプログラムを作成してください。

入力

複数のデータセットが与えられます。各データセットでは、逆ポーランド記法による数式（整数と演算記号が空白文字１文字（半角）で区切られた80文字以内の文字列）が １ 行に与えられます。
ある値を 0 や 0 に限りなく近い値で割るような数式は与えられません。

データセットの数は 50 を超えません。

出力

各データセットごとに、計算結果（実数）を１行に出力してください。なお、計算結果は 0.00001 以下の誤差を含んでもよい。

Sample Input

10 2 12 - /
3 4 - 7 2 3 * + *
-1 -2 3 + +

Output for the Sample Input

-1.000000
-13.000000
0.000000

Solution in JAVA (judge verdict: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;


public class Main {
	private	static			BufferedReader	br            = null;
	private	static	final	String			REGEX_SIGN    = "[\\+\\-\\*\\/]";
	private	static	final	String			REGEX_INTEGER = "[//-]?[0-9]+";
	private	static	final	String			REGEX_FLOAT   = "[//.][0-9]+";

	static {
		br = new BufferedReader(new InputStreamReader(System.in));
	}
 
    /**
     * @param args
     */
	public static void main(String[] args) {
	// TODO Auto-generated method stub
		ArrayList<String>	params = null;
		String				out    = "";

		while ((params = parseParams()) != null) {
			if (params.size() < 3) {
				continue;
			}

			String	tmp1 = null;
			String	tmp2 = null;
			int		curr = 0;
			while (params.size() >= 3) {
				tmp1 = params.get(curr);

				if (tmp1.matches(REGEX_SIGN)) {
					tmp2  = calc(tmp1, params.get(curr - 2), params.get(curr - 1));
					curr -= 2;
					params.remove(curr + 2);
					params.remove(curr + 1);
					params.set(curr, tmp2);
				}

				curr++;
			}

			out += params.get(0) + "/n";
		}

		System.out.print(out);
	}

	private	static String calc(String sign, String val1, String val2) {
		double	result = 0.0;
 
		if (sign.equals("+")) {
			result = Double.parseDouble(val1) + Double.parseDouble(val2);
		}
		else if (sign.equals("-")) {
			result = Double.parseDouble(val1) - Double.parseDouble(val2);
		}
		else if (sign.equals("*")) {
			result = Double.parseDouble(val1) * Double.parseDouble(val2);
		}
		else if (sign.equals("/")) {
			result = Double.parseDouble(val1) / Double.parseDouble(val2);
		}
		 
		return String.format("%.6f", result);
	}
 
	private static ArrayList<String> parseParams() {
		ArrayList<String>	params = null;
		String[]			lines  = null;
		String				strIn  = null;
 
		if ((strIn = parseStdin()) != null) {
			params = new ArrayList<String>();
			lines  = strIn.split(" ");
			for(String line:lines) {
				if (!line.isEmpty()) {
					if (line.matches(REGEX_SIGN) || line.matches(REGEX_INTEGER) || line.matches(REGEX_INTEGER+REGEX_FLOAT)) {
						params.add(line);
					}
				}
			}
		}
		 
		return params;
	}
 
	private static String parseStdin() {
        String  stdin = null;
        
        try {
       		stdin = br.readLine();
        }
        catch (IOException e) {}
 
        return stdin;
	}
}