2012-11-23 67 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如果一个开关做的工作混乱...