别人的版本
考虑了括号,使用了递归,看上去比较靠谱。
function parse(content){
//寻找最后一个左括号
var index = content.lastIndexOf("(");
//如果等式中有左括号
if(index > -1){
//寻找右括号,从左括号的位置开始寻找
var endIndex = content.indexOf(")",index);
//如果等式中有右括号
if(endIndex > -1){
//调用自己算出括号中的结果
var result = parse(content.substring(index + 1,endIndex));
//然后继续调用自己,
//其实这里完成的工作就是"2+3+(2+3*2)"转化成了"2+3+8",也就是用括号中的结果替换括号所在位置
return parse(content.substring(0,index) + ("" + result) + content.substring(endIndex + 1))
}
}
index = content.indexOf("+");
if(index > -1){
return parse(content.substring(0,index)) + parse(content.substring(index + 1));
}
index = content.lastIndexOf("-");
if(index > -1){
return parse(content.substring(0,index)) - parse(content.substring(index + 1));
}
index = content.lastIndexOf("*");
if(index > -1){
return parse(content.substring(0,index)) * parse(content.substring(index + 1));
}
index = content.lastIndexOf("/");
if(index > -1){
return parse(content.substring(0,index)) / parse(content.substring(index + 1));
}
if("" == content){
return 0;
}else{
return content - 0;
}
}
自己实现的版本
基本上是按照人脑计算的思路来的,非常愚蠢用了三次循环,很不优雅。
function cale(input){
input = input.toString().trim()
let inputArr = input.toString().split('')
let outputArr = []
let temp = ''
for (let i = 0;i<inputArr.length;i++){
if(!isNaN(inputArr[i])){
temp += inputArr[i]
} else {
outputArr.push(temp)
temp = ''
outputArr.push(inputArr[i])
}
if(i==inputArr.length-1){
outputArr.push(temp)
inputArr = outputArr.concat()
outputArr = []
}
}
for(let i = 0;i<inputArr.length;i++){
if(inputArr[i+1]=='/') {
inputArr[i+2] = inputArr[i]/inputArr[i+2]
inputArr.splice(i,2)
i-=1
}
if(inputArr[i+1]=='*') {
inputArr[i+2] = inputArr[i]*inputArr[i+2]
inputArr.splice(i,2)
i-=1
}
}
for(let i = 0;i<inputArr.length;i++){
if(inputArr[i+1]=='+') {
inputArr[i+2] = inputArr[i]/1+inputArr[i+2]/1
inputArr.splice(i,2)
i-=1
}
if(inputArr[i+1]=='-') {
inputArr[i+2] = inputArr[i]/1-inputArr[i+2]/1
inputArr.splice(i,2)
i-=1
}
}
return Number(inputArr)
}