我想制作一个后缀计算器。
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) == '/')
答案 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