逆ポーランド記法に関して

投稿者: Anonymous

お世話になります。

プログラムの初心者で、電卓を作ろうという気持ちから、この逆ポーランド記法に
たどり着きました。

各サイト様の情報を調べてみて、何とか動くところまで組めたのですが、最後の最後で
釈然としないところがあります。

通常の記述、『5 / 14 * 2 + 3』という式を処理させてみたのですが、逆ポーランドでは
『5,14,2,*,/,3,+』になってしまいます。(3.17857…)
式の流れだと、まず14と2をかけて、その数で5を割る…といった流れのようですが、
普通は『5,14,/,2,*,3,+』、5を14で割ってから、2かけるだと思います。
Excelでも、通常の式を入力すると、正しい値(3.714286)が出てきますが、
ソースで書き出すと上記の式になってしまいます。

トークン、及びスタックの先頭がともに*や/だった時に起こるのですが、これはこのままで
良いのでしょうか。計算する側が間違っているのでしょうか。

計算ルーチンは、以下の通りです(C#)

    public decimal calc(string[] values)
    {
        Stack<decimal> stValue = new Stack<decimal>();

        decimal d = 0;
        foreach(string s in values)
        {
            if(decimal.TryParse(s,out d))
            {
                stValue.Push(d);
            }
            else
            {
                decimal d1 = stValue.Pop();
                decimal d2 = stValue.Pop();

                switch(s)
                {
                    case "+":
                        d2 += d1;
                        break;
                    case "-":
                        d2 -= d1;
                        break;
                    case "*":
                        d2 *= d1;
                        break;
                    case "/":
                        d2 /= d1;
                        break;
                }
                stValue.Push(d2);
            }
        }

        return stValue.Pop();
    }

================================================
記述変換側、もしくは計算側、どちらを修正するべきなのでしょうか。

よろしくお願いいたします。

解決

皆さん、ありがとうございました。
回答をいただいた結果、どうやら参考にしたサイト様が間違っていたようです。
逆ポーランド記法に変換するところは自己修正しました。
今後ともよろしくお願いいたします。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *