字符串必须正好是一个字符长的错误

时间:2018-04-18 19:44:10

标签: c# stack postfix-notation

我想制作一个后缀计算器。

Stack yigin1 = new Stack();

所以我用

创建了一个输入区域
string inp = Console.ReadLine();

并使用Split()方法解析

string[] words = inp.Split(' ');

还有计算区域。如果tmp是一个操作符从堆栈弹出2个元素,则按temp计算。操作员,并推动堆叠。

foreach(var tmp in words)
{
    if(Convert.ToChar(tmp) == '/')
    {
        int t1;
        int t2;
        t1 = Convert.ToInt32(yigin1.Pop());
        t2 = Convert.ToInt32(yigin1.Pop());
        yigin1.Push(t1 / t2);
    }
    else if (Convert.ToChar(tmp) == '+')
    {
        int t1;
        int t2;
        t1 = Convert.ToInt32(yigin1.Pop());
        t2 = Convert.ToInt32(yigin1.Pop());
        yigin1.Push(t1 + t2);
    }
    else if (Convert.ToChar(tmp) == '-')
    {
        int t1;
        int t2;
        t1 = Convert.ToInt32(yigin1.Pop());
        t2 = Convert.ToInt32(yigin1.Pop());
        yigin1.Push(t1 - t2);
    }
    else if (Convert.ToChar(tmp) == '*')
    {
        int t1;
        int t2;
        t1 = Convert.ToInt32(yigin1.Pop());
        t2 = Convert.ToInt32(yigin1.Pop());
        yigin1.Push(t1 * t2);
    }
    else
    {
        yigin1.Push(Convert.ToInt32(tmp));
    }
}

但是如果我在运行程序时输入输入,如果程序看到像+ - / *这样的运算符。这是崩溃和编译器给出错误

  

字符串必须正好一个字符长(如果我输入3 5 8/2 11 - * +)

标记代码行

if(Convert.ToChar(tmp) == '/')

1 个答案:

答案 0 :(得分:0)

你应该使用

if(tmp == "/")

而不是

if(Convert.ToChar(tmp) == '/')

因为您的输入包含"11"之类的字符串,所以无法将其转换为char。 Char始终是1个符号。

<强> UPD

下面的工作示例

Stack yigin1 = new Stack();
string inp = "3 5 8 / 2 11 - * +";
string[] words = inp.Split(' ');
foreach(var tmp in words)
{
    if (tmp == "/")
    {
        int t1;
        int t2;
        t1 = Convert.ToInt32(yigin1.Pop());
        t2 = Convert.ToInt32(yigin1.Pop());
        yigin1.Push(t1 / t2);
    }
    else if (tmp == "+")
    {
        int t1;
        int t2;
        t1 = Convert.ToInt32(yigin1.Pop());
        t2 = Convert.ToInt32(yigin1.Pop());
        yigin1.Push(t1 + t2);
    }
    else if (tmp == "-")
    {
        int t1;
        int t2;
        t1 = Convert.ToInt32(yigin1.Pop());
        t2 = Convert.ToInt32(yigin1.Pop());
        yigin1.Push(t1 - t2);
    }
    else if (tmp == "*")
    {
        int t1;
        int t2;
        t1 = Convert.ToInt32(yigin1.Pop());
        t2 = Convert.ToInt32(yigin1.Pop());
        yigin1.Push(t1 * t2);
    }
    else
    {
        yigin1.Push(Convert.ToInt32(tmp));
    }
}
// Output 12