1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/phoenixor-rpn.js

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 7.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 06.03.2025 20:38 162095e

rpn.js

Описание функциональности

В математических выражениях используются три типа записей:

    1. Префиксная запись (польская нотация Prefix Expression): оператор находится перед операндами.
    1. Инфиксная запись (Infix Expression): это общепринятый способ представления арифметического или логического выражения, где оператор находится между операндами. Это наиболее распространенный метод записи для людей.
    1. Послувексная запись (Postfix Expressions, обратная польская нотация Reverse Polish Notation): аналогично префиксной записи, но оператор следует за операндами.
  • Префиксная и послувексная записи удобны для вычислений в компьютерах.

rpn.js реализует преобразование инфиксных выражений (таких как обычные четырёхоперационные выражения, такие как 1*(2+3)) в послувексные выражения (123+*), что делает вычисление более простым для компьютера. Инфиксные выражения удобны для чтения и являются наиболее распространенными математическими выражениями, однако для компьютера сложно определить приоритет операторов, поэтому была создана послувексная запись, которая легко вычисляется с использованием стека.

**Эта модель часто используется для вычисления математических выражений. Для демонстрации я создал небольшое приложение-калькулятор (один калькулятор), QR-код в конце, сканирование через WeChat позволяет вам его использовать.**Как начинающему разработчику, прошу вас сделать пожертвование внутри приложения. **## Кодовые фрагменты Сначала несколько функциональных функций, затем проверка на корректность четырёхоперационных символов:

function isOperator(value) {
    var operatorString = '+-*/()×÷';
    return operatorString.indexOf(value) > -1;
}

Вычисление приоритета оператора и сравнение двух операторов по приоритету:

function getPriority(value) {
    if (value === '-' || value === '+') {
        return 1;
    } else if (value === '*' || value === '/' || value === '×' || value === '÷') {
        return 2;
    } else {
        return 0;
    }
}

function priority(v1, v2) {
    return getPriority(v1) <= getPriority(v2);
}
```После этих функциональных шагов, основной задачей является преобразование инфиксного выражения в постфиксное. Используется концепция стека, алгоритм следующий:

> [Преобразование инфиксного выражения в постфиксное]
> * Устанавливаем входящий стек s1 для хранения всех элементов инфиксного выражения, выходящую очередь s для генерации постфиксного выражения, стек s2 для хранения операторов.
> * 1. Инфиксное выражение рассматривается как строку, и мы начинаем просматривать её слева направо.
> * 2. Если это число, то просто добавляем его в очередь s.
> * 3. Если это оператор:
> * 1. Если это '(', добавляем его в стек s2.
> * 2. Если это ')', тогда последовательно добавляем все операторы из стека s2 в очередь s до тех пор, пока не встретится '(' и удалим ')' из стека.
> * 3. Если оператор отличается от скобок и его приоритет выше других операторов, он сразу помещается в стек s2. В противном случае с вершины стека начинают последовательно выталкивать операторы, имеющие более высокий или равный приоритет текущему оператору, и помещают их в очередь s до тех пор, пока не встретят оператор с меньшим приоритетом или открывающуюся скобку.> * Четвертый этап — завершение сканирования. Остаточные операторы в стэке s2 выталкиваются последовательно и добавляются в очередь s.
>
> Полный код представлен ниже в функции **infix2Rpn(exp)**.
>
> После получения обратной польской записи можно использовать идею стэков для вычисления значения выражения. Теория представлена ниже:
>
> > 【Вычисление обратной польской записи】
> >
> > * 1. Создайте пустой стэк.
> > * 2. Прогоните выражение слева направо. При встрече с числом, положите это число в стэк.
> > * 3. При встрече с оператором, вытащите два верхних числа из стэка, выполните операцию над ними (второе число opt первое число) и поместите результат обратно в стэк.
> > * 4. Повторяйте шаги 2 и 3 до конца выражения. Последнее значение в стэке будет значением исходного выражения.
>
> Конкретная реализация кода представлена в функции **calRpnExp(rpnArr)**.
>
> Однако обычно вычисления производятся путём передачи инфиксного выражения, поэтому объединены две вышеупомянутые функции, чтобы передать инфиксное выражение и сразу получить результат вычисления, что показано в функции **calInfixExp(exp)**.
>
> ![Изображение ввода](https://gitee.com/uploads/images/2018/0331/132836_9b94b078_1819189.jpeg)
>
> ## Ссылки
>
> [1. Алгоритм Шунтин-ярд (Shunting-yard algorithm)](https://en.wikipedia.org/wiki/Shunting-yard_algorithm)
>
> [2. Префиксные, инфиксные и постфиксные выражения (Infix, Prefix and Postfix Expressions)](http://www.interactivepython.org/runestone/static/pythonds/BasicDS/InfixPrefixandPostfixExpressions.html)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/phoenixor-rpn.js.git
git@api.gitlife.ru:oschina-mirror/phoenixor-rpn.js.git
oschina-mirror
phoenixor-rpn.js
phoenixor-rpn.js
master