Расширенный алгоритм Дейкстра для получения обратной польской записи математического выражения

Опубликуйте ваши работающие скрипты, библиотеки и ПО для AutoHotkey
lyubarsky
Posts: 8
Joined: 01 Mar 2023, 13:09

Расширенный алгоритм Дейкстра для получения обратной польской записи математического выражения

22 Oct 2023, 13:17

Предлагаемый алгоритм, основанный на алгоритме Дейкстры, предназначен для преобразования математических выражений (инфиксных) в обратную польскую запись (постфиксную), включающих одновременно арифметические и логические операторы, функции с одним или несколькими параметрами, а также пользовательские переменные.

Скажу сразу, что идеи, использованные в представленном здесь алгоритме, в той или иной степени не новы. Основной целью было построить алгоритм, максимально приближенный к алгоритму Дейкстра в том смысле, что он должен быть однопроходным и использовать один стек. Кроме того должно сохраниться основное правило алгоритма Дейкстры извлечения операторов из стека.

К сожалению, представленный алгоритм можно назвать однопроходным лишь условно. Он требует предварительной обработки исходного инфиксного выражения. Предварительная обработка включает удаление всех унарных плюсов и замену унарных минусов специальными символами (здесь ¬ и ~). Они отличаются друг от друга только приоритетом. Первые имеют тот же приоритет, что и бинарные минусы, а вторые имеют наивысший приоритет среди всех операторов. Унарные минусы первого типа встречаются либо в начале выражения, либо сразу после открывающей скобки, либо в начале параметра функции. Унарные минусы второго типа находятся сразу после любого оператора. Например, инфиксное выражение -2**-3, эквивалентное -(2**(-3)), после предварительной обработки преобразуется в ¬2**~3.

Если не убрать бесполезные унарные плюсы, то их тоже придется разделить на два типа по тому же принципу, что и унарные минусы.

Предварительная обработка, к сожалению, добавляет еще несколько проходов инфиксного выражения, и этого, по-видимому, нельзя избежать.

Еще одно отличие постфиксного выражения, полученного с помощью этого алгоритма, связано с функциями двух и более параметров. Он заключается в использовании дополнительного символа (здесь «'») для обозначения первого параметра каждой функции. Например, функция min(1, 2, 3) в постпрефиксном выражении выглядит так: ' 1 2 3 min.

Алгоритм использует простые регулярные выражения. Они присутствуют только в предварительной обработке инфиксных выражений и во вспомогательных функциях, позволяющих узнать, является ли слово именем функции, числом и т. д. При желании все это можно реализовать и без регулярных выражений, но получится более громоздкий.

Предполагается, что написание исходных математических выражений такое же, как и в AutoHotkey.

Файл программы: https://www.dropbox.com/scl/fi/r8ganx1rortp2glk0wkyc/Evaluate-ru.ahk?rlkey=3i5nezfge99vvymywhq8n8wvm&dl=1

Автор будет благодарен за замечания и предложения по улучшению алгоритма.
Spoiler
lyubarsky
Posts: 8
Joined: 01 Mar 2023, 13:09

Re: Расширенный алгоритм Дейкстра для получения обратной польской записи математического выражения

30 Oct 2023, 11:54

Возможны два способа использования пользовательских переменных в postfix выражениях.
Первый. Замена переменных их значениями при трансляции математического выражения в postfix выражение. Такой способ применен в данном сообщении.
Второй. Сохранение в postfix выражении имен пользовательских переменных, а подстановка их значений происходит при вычислении postfix выражения. Этот способ удобен, если postfix выражение используется многократно с меняющимися значениями пользовательских переменных. Например, в цикле или в функции.
Соответствующий алгоритм, незначительно отличающийся от предыдущего, приведен в
https://www.dropbox.com/scl/fi/imuhooosbvcvwvvjbq34v/_Evaluate1-ru.ahk?rlkey=enmu1daptltokuieiqxoe2iky&dl=1

Return to “Скрипты и библиотеки”

Who is online

Users browsing this forum: No registered users and 54 guests