2016-06-16 177 views
-1

我在Unity Engine中使用Dijkstra's Two-stack Calculator。 我得到一個數學錯誤。計算器數學錯誤

輸入:「3 + 2」,輸出:

BUT

輸入:「30 + 20」,輸出:

什麼這段代碼錯了?

CODE

using System.Collections.Generic; 
public class Calculator 
{ 
    public float Evaluate(string Input) 
    { 
     string Expression = "(" + Input + ")"; 
     Stack<string> ops = new Stack<string>(); 
     Stack<float> vals = new Stack<float>(); 
     for (int i = 0; i < Expression.Length; i++) 
     { 
      string s = Expression.Substring(i, 1); 
      if (s.Equals("(")) { } 
      else if (s.Equals("+")) ops.Push(s); 
      else if (s.Equals("-")) ops.Push(s); 
      else if (s.Equals("*")) ops.Push(s); 
      else if (s.Equals("/")) ops.Push(s); 
      else if (s.Equals(")")) 
      { 
       int count = ops.Count; 
       while (count > 0) 
       { 
        string op = ops.Pop(); 
        float v = vals.Pop(); 
        if (op.Equals("+")) v = vals.Pop() + v; 
        else if (op.Equals("-")) v = vals.Pop() - v; 
        else if (op.Equals("*")) v = vals.Pop() * v; 
        else if (op.Equals("/")) v = vals.Pop()/v; 
        vals.Push(v); 
        count--; 
       } 
      } 
      else vals.Push(float.Parse(s)); 
     } 
     return vals.Pop(); 
    } 
} 
+1

你調試嗎?一目瞭然,它沒有考慮兩位數的值。它評估'2 + 0'。 '3'和'0'只留在堆棧上,從不檢查 – Rob

回答

3
else vals.Push(float.Parse(s)); 

這條線僅在一個時間考慮個位數。通過您的代碼

執行命令 輸入=(30 + 20)

I = 0

瓦爾斯堆棧:
OPS堆棧:

I = 1個
瓦爾斯堆棧:3
ops stack:

i = 2
瓦爾斯堆棧:0,3
OPS堆棧:

I = 3
+
瓦爾斯堆棧:0,3
OPS堆棧:+

i = 4的
vals stack:2,0,0
ops stack:+

I = 5
瓦爾斯堆棧:0,2,0,3個
OPS堆棧:+

I = 6

瓦爾斯堆棧:0,2,0,3
OPS堆棧:+

當你完成,你彈出的0和2,並將它們添加到讓你最終的答案:2