Показать сообщение отдельно

  #6  
Старый 13.12.2008, 22:26
scrat
Постоянный
Регистрация: 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;
        }
 
Ответить с цитированием