
13.12.2008, 22:26
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
Если кому-нибудь когда-нибудь понадобится построение ПОЛИЗ(польской инверсной записи - парсинг выражений). То вот вам моя его реализация на c#:
Код:
public void Parse(string text)
{
Stack<char> stack = new Stack<char>(); //рабочкий стек
string ret = ""; //собственно сам полиз
for (int i = 0; i < text.Length; i++)
{
if (text[i] == '(') stack.Push('(');
if (char.IsLetter(text[i]) || char.IsDigit(text[i])) ret += text[i];
if (text[i] == '-'||text[i]=='*'||text[i]=='/'||text[i]=='+')
{
while (stack.Count!=0 && stack.Peek() != '(') // выталкиваем все с большим приоритетом
{
char a = stack.Pop(); //вынимаем...
if (GetOperationPriory(text[i]) < GetOperationPriory(a)) ret += a;
}
stack.Push(text[i]);
}
if (text[i] == ')')
{
while(stack.Count!=0&&stack.Peek()!=')')
{
char k = stack.Pop();
if (k != ')'&&k!='(') ret += k;
}
}
}
if (stack.Count != 0)
{
while (stack.Count != 0)
{
if (stack.Peek() != '(') ret += stack.Pop();
else stack.Pop();
}
}
label2.Text = ret;
}
private int GetOperationPriory(char sym) //приоритет операций
{
if (sym == '+') return 1;
if (sym == '-') return 2;
if (sym == '*') return 3;
if (sym == '/') return 4;
else return 0;
}
|
|
|