JavaScript中解析四则运算表达式的算法
在JavaScript中,我们可以使用JavaScript的函数来解析四则运算表达式,下面演示一个基于正则表达式的实现。
实现原理
- 将四则运算表达式转换为后缀表达式;
- 使用数据栈存储数字,使用符号栈存储运算符;
- 当读取到数字时,我们将其入数据栈;
- 当读取到运算符时,我们将其入符号栈;
- 如果当前符号栈顶的运算符优先级高于待入栈的运算符,我们就可以将栈顶符号弹出,并将其与栈顶两个数字出栈进行计算;
- 计算结果入数据栈,直到符号栈顶的运算符优先级低于待入栈的运算符,将待入栈的运算符入栈;
- 重复步骤3到6,直到表达式的末尾;
- 最后我们将数据栈中的数字弹出,即为表达式的结果。
代码实现
function calculate(str) {
str = str.replace(/\s+/g, '');
let datas = [],
ops = [],
len = str.length;
const getPriority = (op) => {
if (op === '+' || op === '-') {
return 1;
} else if (op === '*' || op === '/') {
return 2;
}
return 0;
};
for (let i = 0; i < len; i++) {
let c = str.charAt(i);
if (/\d/.test(c)) {
let j = i + 1;
while (j < len && /\d/.test(str.charAt(j))) {
j++;
}
let num = str.substring(i, j);
datas.push(parseFloat(num));
i = j - 1;
} else {
while (ops.length > 0 && getPriority(ops[ops.length - 1]) >= getPriority(c)) {
let b = datas.pop();
let a = datas.pop();
let op = ops.pop();
if (op === '+') {
datas.push(a + b);
} else if (op === '-') {
datas.push(a - b);
} else if (op === '*') {
datas.push(a * b);
} else if (op === '/') {
datas.push(a / b);
}
}
ops.push(c);
}
}
while (ops.length > 0) {
let b = datas.pop();
let a = datas.pop();
let op = ops.pop();
if (op === '+') {
datas.push(a + b);
} else if (op === '-') {
datas.push(a - b);
} else if (op === '*') {
datas.push(a * b);
} else if (op === '/') {
datas.push(a / b);
}
}
return datas.length > 0 ? datas[0] : 0;
}
console.assert(calculate('1+2*3/4-5') == -2.5, 'error');
console.assert(calculate('') == 0, 'error');
console.assert(calculate('(1+2*3') == 7, 'error');
示例说明
console.log(calculate('1+2*3/4-5')); //输出结果为-2.5
我们输入的四则运算表达式是 1+2*3/4-5,程序输出的结果应该是-2.5
console.log(calculate('(1+2*3')); //输出结果为7
我们输入的四则运算表达式是 (1+2*3,程序输出的结果应该是7
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript中解析四则运算表达式的算法和示例 - Python技术站