后缀计算器

时间:2012-11-23 00:26:36

标签: c# postfix-notation

在C sharp中创建一个控制台应用程序,通过利用堆栈来解决后缀表示法中的表达式,例如:

表情: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是否为操作数的条件?

4 个答案:

答案 0 :(得分:1)

您的示例输入2,3或+(等于5)或23,+(无效输入)?我假设前者。那你怎么写两位数的数字呢?您当前的方法似乎不支持这一点。我认为你不应该解析这个char-by-char,而是首先将它分成单独的组件,也许使用识别数字和标点符号的正则表达式。作为一个简单示例:Regex.Matches("10 3+", @"(\d+|[\+\-\*/ ])")分为103+,可以使用您已经使用的代码轻松解析和理解有,(空格应该被忽略;它们只是我选择分隔数字以便你可以有多位数的标点符号)和int.TryParse(或double,这需要更复杂的正则表达式模式,请参阅Matching Floating Point Numbers了解该模式)以查看输入是否为数字。

您应该使用Stack<int>来避免强制转换并使编译时安全。

答案 1 :(得分:0)

当然这是错误的:

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

我认为应该是

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

答案 2 :(得分:0)

我真的认为这更像是一次代码审查,但最好是这样 - 首先:请分开一些担忧 - 你把所有东西都变成了一个混乱的大怪物 - 想想问题的各个部分和把它们分成单独的方法开始。

然后:如果你无法解决这个问题,首先要把它缩小:让用户为部件输入某种分离器,或者现在假设他做了 - 空间就可以了。 您可以考虑如何处理运算符,而不使用前后固定的空格。 所以尝试解析“2 3 +”而不是“23+”或“2 3+”...... 如果你这样做,你确实可以使用String.Split让你的生活更轻松!

关于如何识别操作符:非常简单 - 尝试Double.TryParse它会告诉您是否将有效数字传递给它并且您不必浪费时间自己解析数字

而不是在那里使用一段时间你应该使用for或甚至更好的foreach - 你甚至可以用LINQ和[Enumerable.Aggregate][1]做到这一点并获得FUNctional:D

最后......如果开关完成工作,请不要使用if / then / else乱...

答案 3 :(得分:0)

你可以说基本上有没有操作数。甚至数字也可以被认为是将堆栈顶部乘以10并添加数字值的运算符;根据需要累积超过几位数的值。然后你只需要一个操作符来通过将零推到堆栈(也许是空格字符)来播种它。

http://blogs.msdn.com/b/ashleyf/archive/2009/10/23/tinyrpn-calculator.aspx