我制作了Infix
到Postfix
转换器,并认为它有效,但当我回去向我的老师展示时,他测试的一个例子结果是错误的。 :|
如果有人可以帮我解决这个问题,我会很感激,并让我知道这是错的。
我跳过了有关输入数字的按钮的部分,只发布了剩下的部分,
private void button20_Click(object sender, EventArgs e)
{
try
{
string infix = textBox1.Text;
infixTopostfix obj = new infixTopostfix(infix);
textBox1.Text = string.Empty;
Console.WriteLine("{0} is the Postfix of {1}", obj.createPrifex(), infix);
}
catch (Exception e1)
{
Console.WriteLine(e1.ToString());
}
}
上面的部分用于将console.writeline
重定向到我的文本框,以及用于完成所有工作并提供最终结果的按钮。
这是主要课程:
class infixTopostfix
{
public infixTopostfix(string strTemp)
{
strInput = strTemp;
}
private int isOperand(char chrTemp)
{
char[] op = new char[6] { '*', '/', '+', '-', '^', '(' };
foreach (char chr in op)
if (chr == chrTemp)
{
return 1;
}
return 0;
}
private int isOperator(char chrTemp)
{
char[] op = new char[5] { '*', '/', '+', '-', '^' };
foreach (char chr in op)
if (chr == chrTemp)
{
return 1;
}
return 0;
}
private string strResualt = null;
private string strInput = null;
public string createPrifex()
{
int intCheck = 0;
//int intStackCount = 0;
object objStck = null;
for (int intNextToken = 0; intNextToken <= strInput.Length - 1; intNextToken++)
{
intCheck = isOperand(strInput[intNextToken]);
if (intCheck == 1)
stkOperatore.Push(strInput[intNextToken]);
else
if (strInput[intNextToken] == ')')
{
int c = stkOperatore.Count;
for (int intStackCount = 0; intStackCount <= c - 1; intStackCount++)
{
objStck = stkOperatore.Pop();
intCheck = isOperator(char.Parse(objStck.ToString()));
if (intCheck == 1)
{
strResualt += objStck.ToString();
}
}
}
else
strResualt += strInput[intNextToken];
}//end of for(int intNextToken...)
int intCount = stkOperatore.Count;
if (intCount > 0)
{
int c = stkOperatore.Count;
for (int intStackCount = 0; intStackCount <= c - 1; intStackCount++)
{
objStck = stkOperatore.Pop();
intCheck = isOperator(char.Parse(objStck.ToString()));
if (intCheck == 1)
{
strResualt += Convert.ToString(objStck);
}
}
}
return strResualt;
}
private System.Collections.Stack stkOperatore = new System.Collections.Stack();
}
}
以下输入失败:
一个^ B ^(C-d /(E + F)) - (G + H)^ L * Z +ý
此代码的结果不正确:
ABCDEF + / - ^^ GH + -LZY + * ^
正确的结果:
ABCDEF + / - ^^ GH + L ^ Z * -Y +
答案 0 :(得分:1)
将infix notation转换为后缀表示法时,AKA reverse polish notation,必须考虑operator precedence和operator associativity。这些通常作为表格实现,并根据运算符字符在表格中查找。
因为我在代码中没有看到任何优先级或关联性;所以我会说你的代码没有错误但是算法无效。
将中缀转换为后缀的经典算法是shunting yard algorithm Edsger Dijkstra,可能是与您尝试实施的方法最接近的方法。
我建议您使用纸笔来理解分流算法,然后使用逐步使用更多运算符组合的许多测试用例来实现算法。
我所知道的最好的解释是Shunting Yard Algorithm
如果您使用Google for C#shunting yard,您会发现许多实现,只需确保使用它是正确的。许多人喜欢发布这样的例子但经常有错误。在浪费时间之前验证它们是否适用于许多测试用例。