|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Dmitriy Nesmachny 2:5020/2065.609 07 Oct 2001 10:33:04 To : Evgeniy Jirnov Subject : Паpсинг yнаpных опеpатоpов -------------------------------------------------------------------------------- Пятница 28 Сен 2001 16:23:38, Evgeniy Jirnov -> Andrew V Sovgir: EJ>>> там и как... А как сделать такое: Tg(Sin(2+2)+Cos(3+2)) AS>> Я бы для начала советовал почитать об обpатной польской AS>> нотации. AS>> Скоpее всего, тогда все бyдет понятно. EJ> 2All: Кстати ни у кого нет алгоритма преобразования из EJ> обычной записи в EJ> польскую? 1. на входе у тебя строка выражения со скобками, операторами и пр. 2. заводишь стек для операций и буфер для выходной строки 3. начинаешь считывать входную строку с первого символа 4. если это число - пихаешь его в выходную строку если это "(" - пихаешь ее в стек если это ")" - выталкиваешь операции из стека в строку пока не встретишь "(", ее тоже изымаешь из стека, хотя в строку не отправляешь если это конец строки то все что есть на стеке выпихиваешь в строку и выход. если это операция - проверяешь что на стеке: 4.1 если стек пуст или на вершине "(" - пихаешь операцию в стек 4.2 если приоритет операции на вершине стека >= той, которую ты рассматриваешь - выпихиваешь одну операцию из стека в выходную строку и гоуту 4 5. гоуту 3 Пример: tg (sin (2+2)+cos(2+3)) tg в стек ( в стек sin в стек ( в стек 2 в строку + в стек 2 в строку ) + из стека в строку, ( в стеке уничтожить + приоритет + < чем у sin, значит sin в строку, + в стек cos приоритет cos > чем у +, значит cos в стек ( в стек 2 в строку + в стек 3 в строку ) + из стека в строку (до первой скобки) ) cos, + из стека в строку (до второй скобки) eol конец строки: все из стека в строку, там только tg результат: 2 2 + sin 2 3 + cos + tg считать так: проходишь по строке, все числа в стек, встретив операцию изымаешь из стека нужное число операндов, выполняешь операцию и результат кладешь на стек. В конце на стеке будет результат. С уважением, Dmitriy. --- Lara Croft v.4.50 * Origin: #21004011014001FF2AEDB0C9 ;-) (2:5020/2065.609) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/5356045df1b0.html, оценка из 5, голосов 10
|