При написании кода мы иногда сталкиваемся с ситуациями, когда нам нужно проанализировать четыре арифметических выражения сами. В этой статье кратко представлены использование JavaScript для реализации анализа простых четырех арифметических выражений.
1. Знакомый с концепцией
Инфикс нотация (или нотация инфикса) является общим методом представления арифметической или логической формулы. Оператор находится в середине операнда в виде инфикса (пример: 3 + 4). То есть мы используем наиболее часто используемые арифметические выражения. Людям легче понять инфикс, но не легко для компьютерного анализа.
Обратная польская нотация (RPN или обратная польская нотация) - это метод математического выражения, введенный польским математиком Яном Вукасевичем в 1920 году. В обратной польской нотации все операторы помещаются за операндом, поэтому он также называется обозначением суффикса. Обратная польская нотация не требует скобок для определения приоритета оператора. Обратная польская нотация легко использовать структуру стека для анализа и вычисления выражения, поэтому здесь мы анализируем четыре выражения элементов, которые сначала преобразуют из экспрессии Infix в обратную польсную экспрессию. Затем рассчитайте значение.
2. Процесс преобразования
Преобразовать экспрессию инфикса в экспрессию суффикса (алгоритм поля планирования)
1. Введите очередь и выберите отметку
2. Если знак - число, добавьте его в выходной очередь
3. Если это оператор (+-*/), сравните его с оператором в верхней части стека в выходном стеке. Если приоритет меньше или равен оператору в верхней части стека, вспять оператор в верхней части стека и добавьте его в выходной очередь (цикл до тех пор, пока вышеуказанные условия не будут выполнены) и, наконец, нажмите оператора на стек.
4. Если это левый кронштейн, вставьте его в стек
5. Если это близкий кронштейн, оператор постоянно выскакивается из стека и добавляется в выходной очередь и знает, что элемент в верхней части стека - левый кронштейн. Левый кронштейн появляется и не добавляет выходной очередь. Если левого кронштейна не найдено, это означает, что кронштейны в исходном выражении являются асимметричными и есть ошибка.
6. Если входной очередь пуст, и в стеке все еще есть операторы, если оператор в верхней части стека левый кронштейн, это означает, что исходное выражение имеет несоответствующие кронштейны. Посетите операторы в стеке один за другим и добавьте их в выходной очередь.
7. завершен
3. Конвертировать реализацию кода
Функция isoperator (значение) {var operatorString = "+-*/()"; return operatorsting.indexof (value)> -1} function getPrioraty (value) {switch (value) {case '+': case '-': return 1; case ': case'/': return 2; default: return 0;}} function (o1, o2) {o1) {o1) {o1, o2) {o1) {o1)}}}}}}}}}}}}}}}}}. getPrioraty (O2);} функция dal2rpn (exp) {var inputStack = []; var outputStack = []; var outputqueue = []; for (var i = 0, len = exp.length; i <len; i ++) {var cur = exp [i]; if (cur! while (inputstack.length> 0) {var cur = inputStack.shift (); if (isoperator (cur)) {if (cur == '(') {outputStack.push (cur);} else if (cur == ')') {var po = outputStack.pop (); while (po! = '(' && outputStack.length> 0) {output quise.push (po); po = outputStack.pop ();} if (po! 0) {outputqueue.push (outputStack.pop ());} outputStack.push (cur);}} else {outputqueue.push (новое число (cur));}} console.log ('step 2'); if (outputStack.length> 0) {if outputStack [outputStack.length - 1] == '(') {throw "error: unmatched ()";} while (outputStack.length> 0) {output quieue.push (outputStack.pop ());}} console.log ('step three'); return outpur 3 '));; console.log (dal2rpn (' 1 + 2 * 3 ')); console.log (dal2rpn (' 1 + 2 * 3 - 4 /5 ')); console.log (dal2rpn (' (1 + 2) ')); консоль.log (dal2rpn (' (1 + 2) * (3 - 4); 5 ')); console.log (dal2rpn (' (1 + 2) * ((3 - 4) / 5) '));4. Оценка обратной экспрессии польской экспрессии
1. Начнете отметку из входной очереди
2. Если это операнд, добавьте его в выходной стек
3. Если это оператор, выпейте два операнда из выходного стека и вычислите, и вставьте рассчитанное значение в стек.
4. Операция петли. Если входной очередь пуст и в стеке вывода есть только одно число, это число является результатом, в противном случае будет ненужный операнд.
5. Рассчитайте код
Функция evalrpn (rpnqueue) {var outputStack = []; while (rpnqueue.length> 0) {var cur = rpnqueue.shift (); if (! isoperator (cur)) {outputStack.push (cur);} else {if (outputStack.length <2) {throw "unvalid gloe gloe"; {if wout outpact.length. outputStack.pop ();; outputStack.push (getResult (fir, sec, cur));}} if (outputStack.length! = 1) {throw "uncalid выражение";} else {return outputStack [0];}}6. Заключение
Обратное польское представление не используется для этого, когда вы впервые вступаете в контакт с ним, но после того, как вы познакомились с ним, вы обнаружите, что идея на самом деле очень проста, в отличие от представления Infix, которое имеет различные приоритеты, и есть скобки, которые являются особенно неприятной логикой. Обратное польское представление является относительно кратким, и вообще нет необходимости рассматривать приоритет, и нет необходимости использовать скобки, скобки и скобки, чтобы нарушить ситуацию.