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 是否为操作数?

4

4 回答 4

1

您的示例输入是 2、3、+(等于 5)还是 23、+(无效输入)?我假设前者。那么,你会如何写两位数呢?您当前的方法似乎不支持这一点。我认为您不应该逐个字符地解析这个字符,而是首先将其拆分为单独的组件,也许使用识别数字和标点符号的正则表达式。举个简单的例子:Regex.Matches("10 3+", @"(\d+|[\+\-\*/ ])")拆分成10, , 3, 和+, 可以用你已有的代码很容易地解析和理解, (空格应该被忽略;它们只是我用来分隔数字的标点符号, 这样你就可以拥有多个-digit numbers) 和int.TryParse(or double,这需要更复杂的正则表达式模式,请参阅匹配浮点数对于该模式)查看输入是否为数字。

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

于 2012-11-23T01:19:13.583 回答
0

这肯定是错误的:

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

我认为应该是

((int)Char.GetNumericValue(x) <= 9 && (int)Char.GetNumericValue(x) >= 0)
于 2012-11-23T00:31:45.443 回答
0

我真的认为这更像是一次代码审查,但还是这样吧——首先:请分开一些关注点——你把所有东西都烤成了一个大杂烩——想想问题的各个部分,然后把它们放在不同的方法中开始。

然后:如果您无法解决孔问题,请先将其缩小:让用户为零件输入某种分隔符,或者现在假设他这样做了 - 空间就可以了。您可以稍后考虑如何处理没有前缀/后缀空格的运算符。所以尝试解析“2 3 +”而不是“23+”或“2 3+”......如果你这样做,你确实可以String.Split让你的生活更轻松!

至于如何识别操作数:非常容易 - 尝试Double.TryParse它会告诉您是否传递了一个有效数字,而您不必浪费时间自己解析数字

而不是在那里使用一段时间,您应该使用 for 甚至更好的 foreach - 哎呀,您甚至可以使用 LINQ 执行此操作[Enumerable.Aggregate][1]并获得 FUNctional :D

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

于 2012-11-23T05:48:49.077 回答
0

你可以说基本上没有操作数。甚至可以将数字视为将堆栈顶部乘以 10 并添加数字值的运算符;根据需要累积多个数字的值。然后,您只需要一个运算符,通过将零压入堆栈(可能是一个空格字符)来播种它。

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

于 2012-11-23T09:07:57.420 回答