Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在算术运算中实现运算符优先_Javascript - Fatal编程技术网

Javascript 在算术运算中实现运算符优先

Javascript 在算术运算中实现运算符优先,javascript,Javascript,我有一个代码,但它不适用于运算符优先级。它通常从字符串中输入的第一个到最后一个运算符执行。 当字符串遵循优先规则(例如“12*10/5+10-1”=33时,它给出了正确的答案。这是一个拼凑在一起的字符串(读:如果没有额外的工作/错误检查,实际上不应该在任何地方使用)对象,它为两个测试用例都得到了正确的答案。我相信这可以改进,而且可能有更好的算法。根据我的评论,它只是扫描*或/并处理该计算,然后生成一个新的数字/运算符集,包括该结果。我写它主要是为了好玩 我没有费心编写代码来解析字符串,这只需要一

我有一个代码,但它不适用于运算符优先级。它通常从字符串中输入的第一个到最后一个运算符执行。 当字符串遵循优先规则
(例如“12*10/5+10-1”=33时,它给出了正确的答案。这是一个拼凑在一起的字符串(读:如果没有额外的工作/错误检查,实际上不应该在任何地方使用)对象,它为两个测试用例都得到了正确的答案。我相信这可以改进,而且可能有更好的算法。根据我的评论,它只是扫描
*
/
并处理该计算,然后生成一个新的数字/运算符集,包括该结果。我写它主要是为了好玩

我没有费心编写代码来解析字符串,这只需要一个数字数组和一个运算符数组

(我还得到
11.5
作为第二次测试的不正确结果,包括手动测试和运行代码测试)


myCalc={
getResult:函数(n,o){
这个数字=n;
该算子=o;
//继续,直到我们的数字列表成为最终结果
while(this.numbers.length>1)
this.findNext();
返回此。数字[0];
},
findNext:function(){
var opIndex=0;
//查找下一个*或/运算符
对于(i=0;i这里有一个被黑在一起的(读:如果没有额外的工作/错误检查,实际上不应该在任何真实的地方使用)对象,它为两个测试用例都得到了正确的答案。我相信这可以改进,而且可能有更好的算法。根据我的评论,它只是扫描
*
/
并处理该计算,然后生成一个新的数字/运算符集,包括该结果。我写它主要是为了好玩

我没有费心编写代码来解析字符串,这只需要一个数字数组和一个运算符数组

(我还得到
11.5
作为第二次测试的不正确结果,包括手动测试和运行代码测试)


myCalc={
getResult:函数(n,o){
这个数字=n;
该算子=o;
//继续,直到我们的数字列表成为最终结果
while(this.numbers.length>1)
this.findNext();
返回此。数字[0];
},
findNext:function(){
var opIndex=0;
//查找下一个*或/运算符

对于(i=0;i,因为之前没有人提到过它,所以您可以简单地使用函数处理字符串:

var str="15 + 10 * 5 / 10 - 1";
console.log(eval(str));
// logs 19
如果参数是表达式,则eval()计算表达式的值


因为之前没有人提到过,所以您可以使用以下函数简单地处理字符串:

var str="15 + 10 * 5 / 10 - 1";
console.log(eval(str));
// logs 19
如果参数是表达式,则eval()计算表达式的值


这里有一种方法。我喜欢这样做,因为这是我们制作解析器的方式。还有其他方法,如前面提到的,通常在使用像lex/yacc这样的解析器生成器时

正如您所注意到的,有时我们需要保存一个中间结果以处理表达式的另一部分。这种方法称为递归下降解析器,使用环境自己的堆栈来保存临时结果。另一种方法是使用自己维护堆栈,但这没有多大价值

这也是非常灵活的。将语法扩展到不同的优先级非常容易。将下面的
parseFactor
更改为解析否定和括号

函数解析(表达式){
返回表达式.split(“”)
}
函数编号(令牌){
const token=tokens.shift()
返回parseInt(令牌)
}
函数consumerop(允许使用令牌){
常量令牌=令牌[0]
if(允许的。indexOf(令牌)>=0){
tokens.shift()
返回令牌
}
}
函数parseFactor(令牌){
返回用户编号(令牌)
}
函数解析项(令牌){
let value=parseFactor(标记)
让我们行动吧
while(op=consumerop(令牌,['*','/'])){
设nextVal=parseFactor(令牌)
开关(op){
案例“*”:
值*=nextVal
打破
案例“/”:
值/=nextVal
打破
}
}
返回值
}
函数解析表达式(标记){
let value=parseTerm(标记)
让我们行动吧
while(op=consumerop(令牌,['+','-'])){
设nextVal=parseTerm(令牌)
开关(op){
格“+”:
值+=nextVal
打破
案例'-':
值-=nextVal
打破
}
}
返回值
}
函数求值(表达式){
常量标记=解析(表达式)
返回解析表达式(标记)
}

evaluate('15+10*5/10-1')
这里有一种方法。我喜欢这样做,因为这就是我们制作解析器的方式。还有前面提到的其他方法,通常在使用诸如lex/yacc之类的解析器生成器时使用

正如您所注意到的,有时我们需要保存一个中间结果以处理表达式的另一部分。这种方法称为递归下降解析器,使用环境自己的堆栈来保存临时结果。另一种方法是使用自己维护堆栈,但这没有多大价值

这也是非常灵活的。将语法扩展到不同的优先级非常容易。将下面的
parseFactor
更改为解析否定和括号

函数解析(表达式){
返回表达式.split(“”)
}
函数编号(令牌){
const token=tokens.shift()
返回parseInt(令牌)
}
函数consumerop(允许使用令牌){
常量令牌=令牌[0]
if(允许的。indexOf(令牌)>=0){
tokens.shift()
返回令牌
}
}
函数parseFactor(令牌){
返回用户编号(令牌)
}
函数解析项(令牌){
let value=parseFactor(标记)
让我们行动吧
while(op=consumerop(令牌,['*','/'])){
设nextVal=parseFactor(令牌)
开关(op){
案例“*”:
值*=nextVal
打破
案例“/”:
值/=nextVal
打破
}
}
返回值
}
函数解析表达式(标记){
let value=parseTerm(标记)
让我们行动吧
而
var str="15 + 10 * 5 / 10 - 1";
console.log(eval(str));
// logs 19