|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
|||||||||||
.NET 4.x Преобразовать строку в обратную польскую запись.01.10.2011, 17:22. Показов 4794. Ответов 13
Метки нет (Все метки)
Собственно как это реализовать.
Например входная строка "AvB" (где A и B заглавные симвволы) должен получить "B A v" А этот код пишет "A B" Описание стека; Стек перставлен в виде универсального класса. и имеет следующие методы. Add(X) добавляет элемент в начало; Del() удаляет ээлемент; Del_And_ReturnData() Возвращает значение 1 (с верху) элемента и удаляет его; Del_Next_And_ReturnData() Возвращает значение 2 (с верху) элемента и удаляет его; PS знаю что получился не совсем стек... Если такого нету то ОшибкаToString() Возвращает все элементы стека в виде строки. Поля Data первый элемент стека DataNext // второй элемент стека если есть ![]() Сам класс стека
Код программы
0
|
|||||||||||
| 01.10.2011, 17:22 | |
|
Ответы с готовыми решениями:
13
Преобразование математической формулы в обратную польскую запись Ошибка в алгоритме преобразования выражения в обратную польскую запись |
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 01.10.2011, 17:31 | |
|
Реализуйте алгоритм Shunting Yard за авторством Дейкстры и будет вам счастье.
Кстати, зачем вам самопальный стэк? Готовый класс уже есть в System.Collection.Generics
0
|
|
|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
||
| 01.10.2011, 17:40 [ТС] | ||
|
Тут такое дело просто в лабораторке так написанно ![]() Написать стек типа "char" и с его помощью преобразовать... Но на тип мне ... По этому сделал универсальным.
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 01.10.2011, 18:04 | ||||||
|
Дело было вечером, делать было нечего...
Я как-то баловался в шарпе и вот накатал некое подобие реализации алгоритма Дайкстры:
P.S. Переменная log - это, собственно, логгер - для себя. Все, что с ней связано, можно смело удалять из кода
0
|
||||||
|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
||||||
| 01.10.2011, 19:33 [ТС] | ||||||
|
а как проверить ответ на верность?
Допустим я ввел AvB^(C→(B^!A)) а получил A B C B A ! ^ → ^ v поправил но все равно не верно...
0
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 01.10.2011, 20:01 | ||
|
Как вариант, реализовать алгоритм вычисления выражений и проверить правильность результата.
0
|
||
|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
|
| 02.10.2011, 17:39 [ТС] | |
|
повозился повозился и что то не получается...
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 02.10.2011, 17:43 | |
|
Что именно не получается?
0
|
|
|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
|||||||
| 02.10.2011, 22:33 [ТС] | |||||||
|
Алгоритм
1)Пока есть ещё символы для чтения: 2)Читаем очередной символ. 3)Если символ является числом, добавить его к выходной строке. 4)Если символ является символом функции, помещаем его в стек. 5)Если символ является открывающей скобкой, помещаем его в стек. 6)Если символ является закрывающей скобкой: 7)До тех пор, пока верхним элементом стека не станет открывающая скобка, выталкиваем элементы из стека в выходную строку. При этом открывающая скобка удаляется из стека, но в выходную строку не добавляется. Если после этого шага на вершине стека оказывается символ функции, выталкиваем его в выходную строку. Если стек закончился раньше, чем мы встретили открывающую скобку, это означает, что в выражении либо неверно поставлен разделитель, либо не согласованы скобки. 8) Если символ является оператором о1, тогда: 1) пока… … (если оператор o1 ассоциированный, либо лево-ассоциированный) приоритет o1 меньше либо равен приоритету оператора, находящегося на вершине стека… … (если оператор o1 право-ассоциированый) приоритет o1 меньше приоритета оператора, находящегося на вершине стека… … выталкиваем верхние элементы стека в выходную строку; 2) помещаем оператор o1 в стек. Когда входная строка закончилась, вытолкнуть все символы из стека в выходную строку. В стеке должны были остаться только символы операторов; если это не так, значит в выражении не согласованы скобки. С 8 пункта не понял что делать... Пока что вот такой код.. код
0
|
|||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 02.10.2011, 23:41 | |
|
Да все очень просто, давайте начнем с основ.
Вы, я так понимаю, реализуете алгоритм для логических выражений. Вот у нас есть логические операторы: !, ∨, ∧, ⊻, ←, → Начните с того, что для каждого из них определите ассоциированность и приоритет - они нам потребуются во время парса строки. Как определитесь, восьмой шаг станет довольно простым условием: проверяем данный оператор на ассоциированность и приоритет с оператором, находящимся сверху стэка. Если наш оператор ниже по приоритету или лево-ассоциированный, то выталкиваем операторы из стэка и вставляем в конец готовой строки.
1
|
|
|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
|
| 03.10.2011, 14:10 [ТС] | |
|
ассациативноссть и приоретет...
Это как??? Где ни будь алгоритм есть хотя бы на псевдо коде...
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 03.10.2011, 15:26 | |||
|
Например: A -> B -> C. В каком порядке выполнять? Сначала B -> C, а потом A -> [результат] или сначала A -> B, а потом [результат] -> C? Если первый вариант, то оператор -> - правоассоциативный, если второй вариант, то левоассоциативный. Если без разницы (A V B V C, например), то ассоциативность отсутствует. Для простоты можно приравнять к левоассоциативным. Или вот оператор "!" - он явно правоассоциативный, т.к. !!!!A - сначала высчитываем !А, потом !!А и т.д., то есть идем справа налево. Это надо определить для каждого оператора. Приоритет - ну это как в арифметике: какой оператор используется в первую очередь при отсутствие скобок. Например, выражение A V B ^ C. Логическое "И" имеет приоритет выше, чем "ИЛИ", потому сначала высчитываем B ^ C, а потом результат V A. Как в математике: x + y * z - сначала умножение, потом сложение. Для каждого оператора надо определить свой приоритет. Чем число выше, например, тем больше приоритет оператора. Это будет использоваться в условиях восьмого шага алгоритма. Можно конечно обойтись и без всех этих прелестей, но тогда пользователь будет обязан каждое вычисление обводить скобками, чтобы было понятно что сперва, а что - потом.
1
|
|||
|
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
|
|
| 03.10.2011, 16:26 | |
|
Посмотрите в этой ветке выложенныи мною код, может, поможет
Решить пример записанный обратной польской
0
|
|
|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
|
| 05.10.2011, 23:45 [ТС] | |
|
для строки !Av(B>(C<>!D)^A)
такая запись верна? A ! B C D ! <> > A ^ v А то я не уверен ...
0
|
|
| 05.10.2011, 23:45 | |
|
Помогаю со студенческими работами здесь
14
Как использовать обратную польскую запись для решения дробно-рациональных уравнений Преобразование выражения в польскую запись
Строку в обратную польскую запись Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|