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 C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        Solver solver = new Solver();
        solver.solve();
        return;
    }
}

class Solver
{
    public Solver()
    {
    }

    public void solve()
    {
        while (input() == 0) ;
    }

    private int input()
    {
        string[] str;
        try
        {
            str = rsa();
        }
        catch (System.IO.IOException)
        {
            return 1;
        }
        catch (System.ArgumentOutOfRangeException)
        {
            return 1;
        }
        catch (System.OutOfMemoryException)
        {
            return 1;
        }
        catch (System.NullReferenceException)
        {
            return 1;
        }

        List<double> sta = new List<double>();

        for (int i = 0; i < str.Length; i++)
        {
            double parsed;
            if (double.TryParse(str[i], out parsed)) {
                sta.Add(parsed);
            }
            else
            {
                int counter = sta.Count;
                double var1 = sta[counter - 2];
                double var2 = sta[counter - 1];
                sta.RemoveAt(counter - 1);
                sta.RemoveAt(counter - 2);
                switch (str[i].ToCharArray()[0])
                {
                    case '+':
                        //Console.WriteLine(var1 + var2);
                        sta.Add(var1 + var2);
                        break;
                    case '-':
                        //Console.WriteLine(var1 - var2);
                        sta.Add(var1 - var2);
                        break;
                    case '*':
                        //Console.WriteLine(var1 * var2);
                        sta.Add(var1 * var2);
                        break;
                    case '/':
                        //Console.WriteLine(var1 / var2);
                        sta.Add(var1 / var2);
                        break;
                    default:
                        break;
                }
            }
        }
        Console.WriteLine(sta[0].ToString("0.000000"));

        return 0;
    }

    static String rs() { return Console.ReadLine(); }
    static int ri() { return int.Parse(Console.ReadLine()); }
    static long rl() { return long.Parse(Console.ReadLine()); }
    static double rd() { return double.Parse(Console.ReadLine()); }
    static String[] rsa() { return Console.ReadLine().Split(' '); }
    static int[] ria() { return Array.ConvertAll(Console.ReadLine().Split(' '), e => int.Parse(e)); }
    static long[] rla() { return Array.ConvertAll(Console.ReadLine().Split(' '), e => long.Parse(e)); }
    static double[] rda() { return Array.ConvertAll(Console.ReadLine().Split(' '), e => double.Parse(e)); }
}