В математических выражениях используются три типа записей:
- Префиксная запись (польская нотация Prefix Expression): оператор находится перед операндами.
- Инфиксная запись (Infix Expression): это общепринятый способ представления арифметического или логического выражения, где оператор находится между операндами. Это наиболее распространенный метод записи для людей.
- Послувексная запись (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)**.
>
> 
>
> ## Ссылки
>
> [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 )