手机版

解析javascript中四个运算表达式的算法和示例

时间:2021-10-07 来源:互联网 编辑:宝哥软件园 浏览:

在编写代码时,我们有时会遇到需要自己解析这四个算术表达式的情况。本文简要介绍了如何用JavaScript解析简单的四种算术表达式。

第一,熟悉概念。

中缀表示法(或中缀表示法)是一种通用的算术或逻辑公式表示方法,运算符以中缀形式位于操作数的中间(例:3 4)。也就是最常用的算术表达式,中缀表达式人类容易理解,但计算机分析不容易。

逆波兰符号(RPN,或逆波兰符号)是波兰数学家扬武卡谢维奇在1920年引入的数学表达式。在逆波兰符号中,所有运算符都放在操作数后面,因此也称为后缀符号。逆波兰符号不需要括号来标识运算符的优先级。反向波兰符号很容易使用堆栈结构来分析和计算表达式,所以这里我们分析四个元素表达式,它们是从中缀表达式转换成反向波兰表达式的。然后计算数值。

第二,转换过程。

中缀表达式被转换成后缀表达式(调度字段算法)。

1.输入队列中会弹出一个标记。2.如果标记是一个数字,将其添加到输出队列中。3.如果是运算符(-*/),请将其与输出堆栈中的顶级运算符进行比较。如果优先级小于或等于top运算符,则弹出top运算符并将其添加到输出队列中(循环直到不满足上述条件)。最后,将当前操作符推入堆栈。4.如果它是左括号,请将其压入堆栈。5.如果是右括号,从堆栈中弹出运算符并加入输出队列,直到堆栈顶部的元素是左括号。弹出左括号,不要加入输出队列。如果找不到左括号,说明原表达式中的括号不对称,存在错误。6.如果输入队列为空,并且堆栈中有运算符,如果堆栈顶部的运算符是左括号,则意味着原始表达式有不匹配的括号。逐个弹出堆栈中的运算符,并将其添加到输出队列中。7.完成。

三、转换代码的实现。

函数IsoOperator(value){ var operator string='-*/()';返回operator string . indexof(value)-1 }函数getprioriaty(value){ switch(value){ case ' ' : case '-' : return 1;大小写' * ' : case '/' : return 2;default:return返回0;} }函数prioriaty(O1,O2){ return getprioriaty(O1)=getprioriaty(O2);}函数dal2r pn(exp){ var inputStack=[];var outputStack=[];var outputQueue=[];for(var i=0,len=exp.length我透镜;I){ var cur=exp[I];if(cur!=' '){ inputstack . push(cur);}}console.log('第一步');while(inputstack . length 0){ var cur=inputstack . shift();if(isoPErter(cur)){ if(cur=='('){ output stack . push(cur);} else if(cur==')'){ var po=output stack . pop();while(po!='(' OutPut Stack . length 0){ OutPut queue . push(po);po=OutPutStack . pop();}if(po!='('){ throw ' error : unmatched()';} } else { while(prioriaty(cur,output stack[output stack . length-1])output stack . length 0){ output queue . push(output stack . pop());} output stack . push(cur);} } else { outputqueue . push(new Number(cur));}}console.log('第二步');if(output stack . length 0){ if(output stack[output stack . length-1]=')' | | output stack[output stack . length-1]=='('){ throw ' error : unmatched()';} while(output stack . length 0){ output queue . push(output stack . pop());}}console.log('第三步');返回输出队列;} console . log(dal2r pn(' 1 2 ');console . log(dal2r pn(' 1 2 3 '));console . log(dal2r pn(' 1 2 * 3 ');console . log(dal2r pn(' 1 2 * 3-4/5 ');console . log(dal2r pn('(1)2 '));console . log(dal2r pn('(1 2)*(3-4)/5 '));console . log(dal2r pn('(1 2)*((3-4)/5)'));四.逆波兰表达式的评估。

1.从输入队列中弹出标记。2.如果是操作数,将其添加到输出堆栈中。3.如果是运算符,从输出堆栈中弹出两个操作数进行计算,并将计算出的值压入输出堆栈。4.循环操作,如果输入队列为空,输出栈只有一个数字,这个数字就是结果,否则,就有多余的操作数。

动词(verb的缩写)计算代码

函数eval rpn(rpnQueue){ var output stack=[];while(rpnqueue . length 0){ var cur=rpnqueue . shift();if(!isoPErter(cur)){ output stack . push(cur);} else { if(OutPutStack . length 2){ throw ' unvalid stack length ';} var sec=OutputStack . pop();var fir=OutputStack . pop();outputStack.push(getResult(fir,sec,cur));}}if(outputStack.length!=1){抛出' un valid expression ';} else { return OutPutStack[0];}} VI。结语。

逆波兰记法刚接触的时候并不觉得习惯,但是熟悉之后发现他的思路其实很简单,不像中缀记法,也有各种优先级,括号之类的。逻辑特别麻烦,逆波兰记法相对简单,根本不需要考虑优先级,也没有用括号、括号、大括号来糟蹋。

版权声明:解析javascript中四个运算表达式的算法和示例是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。