2012-11-23 106 views
4

使得在升C通過利用堆疊來解決後綴符號表達式,如控制檯應用程序:後綴計算器

表達式:43 + 2 * 答案:14

我所做所以遠:

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

namespace ConsoleApplication7 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     string input = "23+"; 
     int counter = 0; 
     Stack values = new Stack(); 


     while (counter < input.Length) 
     { 
      int temp1, 
       temp2, 
       answer; 

      char x = char.Parse(input.Substring(counter, 1)); 

      if (); 
      else if (x == '+') 
      { 
       temp1 = (int)values.Pop(); 
       temp2 = (int)values.Pop(); 

       values.Push(answer = temp1 + temp2); 
      } 
      else if (x == '-') 
      { 
       temp1 = (int)values.Pop(); 
       temp2 = (int)values.Pop(); 

       values.Push(answer = temp1 - temp2); 
      } 
      else if (x == '*') 
      { 
       temp1 = (int)values.Pop(); 
       temp2 = (int)values.Pop(); 

       values.Push(answer = temp1/temp2); 
      } 
      else if (x == '/') 
      { 
       temp1 = (int)values.Pop(); 
       temp2 = (int)values.Pop(); 

       values.Push(answer = temp1 * temp2); 
      } 

      counter++; 

     } 
     Console.WriteLine(values.Pop()); 
    } 
} 

對於if語句,我可以使用什麼作爲條件來檢查x是否是一個操作數?

+1

當您逐步完成代碼並審覈每個堆棧操作時會發生什麼? –

回答

0

這肯定是錯誤的:

((int)Char.GetNumericValue(x) <= 0 && (int)Char.GetNumericValue(x) >= 0) 

我覺得應該是

((int)Char.GetNumericValue(x) <= 9 && (int)Char.GetNumericValue(x) >= 0) 
+0

這就是給我的麻煩。我應該使用什麼條件來檢查x是否是一個數字?應該是((int)Char.GetNumericValue(x)<= 0 ||(int)Char.GetNumericValue(x)> = 0)? – mathanor

1

就是你們的榜樣輸入2,3,+(相當於5),或23,+(這是輸入無效)?我假設前者。那麼,你會如何寫出兩位數的數字?你目前的做法似乎不支持這一點。我認爲你不應該逐字符地解析這個char,而是先將它分解成單獨的組件,或許使用一個能夠識別數字和標點符號的正則表達式。作爲一個簡單的例子:Regex.Matches("10 3+", @"(\d+|[\+\-\*/ ])")分爲10,,3+,它們可以很容易地用你已經擁有的代碼進行分析和理解(空格應該被忽略;它們只是我選擇的用於分隔數字的標點符號)您可以有多位數字)和int.TryParse(或double,這需要更復雜的正則表達式模式,請參閱該模式的Matching Floating Point Numbers)以查看輸入是否是數字。

您應該使用Stack<int>來避免強制轉換並使編譯時安全。

0

我真的認爲這更像是一個代碼審查,但也這樣吧 - 第一:請單獨的一些顧慮 - 你的一切烘烤成一個大混亂的怪物 - 思考問題的部分,並把它們變成獨立開始的方法。

然後:如果你不能解決漏洞問題,先讓它變小:讓用戶爲部件輸入某種分離器,或者現在假設他確實 - 空間會很好。 您可以考慮如何處理操作員,而不在以後填入空格。 因此,請嘗試解析「2 3+」而不是「23+」或「2 3+」......如果你這樣做,你確實可以使用String.Split讓你的生活變得更容易!

至於你如何識別操作性:非常簡單 - 嘗試Double.TryParse它會告訴你,如果你通過一個有效的號碼,你不必與自己解析數

而不是浪費你的時間在那裏使用一段時間,你應該使用一個甚至更好的foreach - 你甚至可以用LINQ和[Enumerable.Aggregate][1]做到這一點,並獲得FUNctional:D

最後...不要使用這個if/then/else如果一個開關做的工作混亂...