Я сделал преобразователь Infix
в Postfix
, и думал, что это сработало, но когда я вернулся и показал его моему учителю, один из примеров, которые он тестировал, оказался неправильным. : |C# Infix to Postfix convertor не дает правильного ответа, если несколько случаев
Буду признателен, если кто-то может помочь мне в этом вопросе, и дайте мне знать, что случилось.
Я пропустил часть о кнопках для ввода цифр и только выложил остальное,
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();
}
}
Здесь вход, который терпит неудачу:
А^В^(CD/(E + F)) - (G + Н)^L * Z + Y
результат этого кода, который является неправильным:
ABCDEF +/- ^^ GH + -LZY + *^
Правильный результат:
ABCDEF +/- ^^ GH + L^Z * -Y +
lol i Googled Shunting yard algorithm, похоже, что вы правы! судя по wikipedia, я пытаюсь преобразовать инфикс в постфикс с использованием этого алгоритма, во всяком случае, я думаю, что моя проблема лежит в приоритете операторов – Pedram