JavaScript 中缀表达式计算器实现
JavaScript 中缀表达式计算器实现
本文将介绍如何使用 JavaScript 实现一个简单的中缀表达式计算器。
1. 中缀表达式转换为后缀表达式
中缀表达式是我们常见的数学表达式,例如 2 + 3 * 4 - 5。后缀表达式,也称为逆波兰表达式,将运算符放在操作数的后面。例如,上述中缀表达式的后缀表达式为 2 3 4 * + 5 -。
2. 代码示例
以下是 JavaScript 代码示例,演示如何将中缀表达式转换为后缀表达式并进行计算:
var arr = [2, '+', 3, '+', 4, '-', 5, '*', 6, '/', 2, '+', 8, '='];
var oShi = document.getElementById('shi');
var oAns = document.getElementById('ans');
oShi.innerText = arr.join('');
var aShu = [];
var aFu = [];
var type, val;
for (var i = 0; i < 3; i++) {
type = typeof arr[i];
console.log(type);
if (type == 'number') {
aShu.push(arr[i]);
} else {
aFu.push(arr[i]);
}
}
console.log(aShu, aFu);
for (var i = 3; i < arr.length; i++) {
type = typeof arr[i];
if (type == 'number') {
aShu.push(arr[i]);
console.log(aShu, aFu);
} else {
var w = arr[i];
var D = aFu.pop();
judge(w, D);
}
}
function judge(w, D) {
switch (w) {
case '*':
case '/':
if (D == '+' || D == '-') {
aFu.push(D);
aFu.push(w);
console.log(aShu, aFu);
break;
}
default:
var num2 = aShu.pop();
var num1 = aShu.pop();
switch (D) {
case '+':
n val = num1 + num2;
aShu.push(val);
if (aFu.length == 0) {
D = aFu.pop();
judge(w, D);
} else {
aFu.push(w);
}
console.log(aShu, aFu);
break;
case '-':
val = num1 - num2;
aShu.push(val);
if (aFu.length == 0) {
D = aFu.pop();
judge(w, D);
} else {
aFu.push(w);
}
console.log(aShu, aFu);
break;
case '*':
val = num1 * num2;
aShu.push(val);
if (aFu.length == 0) {
D = aFu.pop();
judge(w, D);
} else {
aFu.push(w);
}
console.log(aShu, aFu);
break;
case '/':
val = num1 / num2;
aShu.push(val);
if (aFu.length == 0) {
D = aFu.pop();
judge(w, D);
} else {
aFu.push(w);
}
console.log(aShu, aFu);
break;
}
}
}
3. 代码解释
- 代码首先定义了一个数组
arr,用来存储中缀表达式。 - 然后,使用两个数组
aShu和aFu分别存储操作数和运算符。 - 代码循环遍历数组
arr,并将操作数和运算符分别放入对应的数组中。 - 在循环中,代码调用
judge()函数,对运算符进行优先级判断和计算。 judge()函数根据运算符的优先级,将操作数和运算符进行计算,并更新aShu数组。
4. 总结
本文介绍了如何使用 JavaScript 实现一个简单的中缀表达式计算器。代码示例展示了如何将中缀表达式转换为后缀表达式,并进行计算。您可以根据实际需要对代码进行修改和扩展。
5. 代码完善
var arr = [2, '+', 3, '+', 4, '-', 5, '*', 6, '/', 2, '+', 8, '='];
var oShi = document.getElementById('shi');
var oAns = document.getElementById('ans');
oShi.innerText = arr.join('');
var aShu = [];
var aFu = [];
var type, val;
for (var i = 0; i < 3; i++) {
type = typeof arr[i];
console.log(type);
if (type == 'number') {
aShu.push(arr[i]);
} else {
aFu.push(arr[i]);
}
}
console.log(aShu, aFu);
for (var i = 3; i < arr.length; i++) {
type = typeof arr[i];
if (type == 'number') {
aShu.push(arr[i]);
console.log(aShu, aFu);
} else {
var w = arr[i];
var D = aFu.pop();
judge(w, D);
}
}
function judge(w, D) {
switch (w) {
case '*':
case '/':
if (D == '+' || D == '-') {
aFu.push(D);
aFu.push(w);
console.log(aShu, aFu);
break;
}
default:
var num2 = aShu.pop();
var num1 = aShu.pop();
switch (D) {
case '+':
n val = num1 + num2;
aShu.push(val);
if (aFu.length == 0) {
D = aFu.pop();
judge(w, D);
} else {
aFu.push(w);
}
console.log(aShu, aFu);
break;
case '-':
val = num1 - num2;
aShu.push(val);
if (aFu.length == 0) {
D = aFu.pop();
judge(w, D);
} else {
aFu.push(w);
}
console.log(aShu, aFu);
break;
case '*':
val = num1 * num2;
aShu.push(val);
if (aFu.length == 0) {
D = aFu.pop();
judge(w, D);
} else {
aFu.push(w);
}
console.log(aShu, aFu);
break;
case '/':
val = num1 / num2;
aShu.push(val);
if (aFu.length == 0) {
D = aFu.pop();
judge(w, D);
} else {
aFu.push(w);
}
console.log(aShu, aFu);
break;
}
}
}
原文地址: https://www.cveoy.top/t/topic/paic 著作权归作者所有。请勿转载和采集!