19742


お世話になります。

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

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

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

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

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

[code]

        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();
        }
    
[/code]

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

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


CC BY-SA 3.0
2015-12-05T06:41:17.430
19654
2015-12-08T00:31:11.940
9374
question
アルゴリズム
逆ポーランド記法に関して


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


CC BY-SA 3.0
2015-12-08T00:31:11.940
19742
2015-12-08T00:31:11.940
9374
19654
answer