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;
      }
  }
}
JavaScript 中缀表达式计算器实现

原文地址: https://www.cveoy.top/t/topic/paic 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录