ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 13.12.2008, 22:26
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме:
5812656

Репутация: 1540


Отправить сообщение для scrat с помощью ICQ
По умолчанию

Если кому-нибудь когда-нибудь понадобится построение ПОЛИЗ(польской инверсной записи - парсинг выражений). То вот вам моя его реализация на 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;
        }
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сюда выкладываем все проги для фрикринга мобильников, которых знаем! nigger Сотовый фрикинг 5 11.04.2009 11:15
Американским студентам запретили пользоваться Skype KPOT_f!nd Мировые новости 1 28.09.2006 03:47
Любителям квестов сюда!! FoX's Болталка 10 25.01.2005 20:42



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ