|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
08.03.2009, 16:15 | #1 |
Пользователь
Регистрация: 21.09.2008
Сообщений: 70
|
Задача на обратную польскую запись
Помогите, пожалуйста, разобраться с задачей.
Заданное простое выражение, содержащее вызовы функций преобразовать в обратную польскую запись. Например, y=f(I, J+g(x+y), K*L, x(I, J), 5)+2х. Проблема в том, что выражение может быть любое, читается либо из файла, либо ввод с клавиатуры. Заранее, очень признателен и буду рад любой помощи. |
08.03.2009, 17:37 | #2 |
Пользователь
Регистрация: 06.02.2009
Сообщений: 89
|
Ну алгоритм такой (чтобы реализовать его надо немного времени, так что уж попытайся сам):
Алгоритм * Пока есть ещё символы для чтения: * Читаем очередной символ. * Если символ является числом, добавить его к выходной строке. * Если символ является символом функции, помещаем его в стек. * Если символ является разделителем аргументов функции (то есть, запятая): До тех пор, пока верхним элементом стека не станет открывающаяся скобка, выталкиваем элементы из стека в выходную строку. Если открывающаяся скобка не встретилась, это означает, что в выражении либо неверно поставлен разделитель, либо несогласованы скобки. * Если символ является оператором, о1, тогда: 1) пока… … (если оператор o1 ассоциированный, либо лево-ассоциированный) приоритет o1 меньше либо равен приоритету оператора, находящегося на вершине стека… … (если оператор o1 право-ассоциированый) приоритет o1 меньше приоритета оператора, находящегося на вершине стека… … выталкиваем верхние элементы стека c бо́льшим либо равным приоритетом в выходную строку; 2) помещаем оператор o1 в стек. * Если символ является открывающейся скобкой, помещаем его в стек. * Если символ является закрывающейся скобкой, выталкиваем элементы из стека в выходную строку до тех пор, пока на вершине стека не окажется открывающаяся скобка. При этом открывающаяся скобка удаляется из стека, но в выходную строку не добавляется. Если после этого шага на вершине стека оказывается символ функции, выталкиваем его в выходную строку. Если стек закончился раньше, чем мы встретили открывающуюся скобку, это означает, что в выражении несогласованы скобки. * Когда входная строка закончилась, вытолкнуть все символы из стека в выходную строку. В стеке должны были остаться только символы операторов; если это не так, значит в выражении несогласованы скобки. Взято отсюда - http://ru.wikipedia.org/wiki/%D0%9E%...B8%D1%81%D1%8C
Если вдруг захотите сказать мне спасибо - воспользуйтесь кнопкой "Добавить отзыв"
|
08.03.2009, 18:00 | #3 |
Пользователь
Регистрация: 27.10.2008
Сообщений: 38
|
работает со знаками *, +, /, -, ^(возведение в степень)
Код:
Последний раз редактировалось CrazyRabbit; 08.03.2009 в 18:04. |
08.03.2009, 19:07 | #4 |
Пользователь
Регистрация: 21.09.2008
Сообщений: 70
|
Спасибо большое за алгоритм и за программу.)
А программа, как я понял, с функциями не работает? |
08.03.2009, 19:10 | #5 |
Пользователь
Регистрация: 06.02.2009
Сообщений: 89
|
Нет, как я понял, только арифметические операции
Если вдруг захотите сказать мне спасибо - воспользуйтесь кнопкой "Добавить отзыв"
|
08.03.2009, 19:12 | #6 |
Пользователь
Регистрация: 21.09.2008
Сообщений: 70
|
|
08.03.2009, 19:16 | #7 |
Пользователь
Регистрация: 06.02.2009
Сообщений: 89
|
Кстати, вспомнил у меня есть прога с польской нотацией с функциями, только это не основная тема проги, для функции в функции не должно по идее ничего поменяться
Если вдруг захотите сказать мне спасибо - воспользуйтесь кнопкой "Добавить отзыв"
|
11.03.2009, 21:54 | #8 |
Пользователь
Регистрация: 21.09.2008
Сообщений: 70
|
Спасибо большое)
А что значит право(лево)-ассоциированый? |
11.03.2009, 22:09 | #9 |
Пользователь
Регистрация: 06.02.2009
Сообщений: 89
|
Честно говоря, хз
Если вдруг захотите сказать мне спасибо - воспользуйтесь кнопкой "Добавить отзыв"
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
задача на тип-ЗАПИСЬ | Fornarina | Помощь студентам | 1 | 01.03.2009 11:00 |
Задача на запись(Record) | Impario | Помощь студентам | 2 | 10.02.2009 13:58 |
Pascal Перевод в Польскую запись | ЮнПрог | Помощь студентам | 3 | 29.12.2008 13:51 |
Как в Методе гаусса создать обратную(At) матрицу!выполнить проверку! | vdv08 | Помощь студентам | 1 | 29.10.2008 15:46 |