javascript中解析四则运算表达式的算法和示例

JavaScript中解析四则运算表达式的算法

在JavaScript中,我们可以使用JavaScript的函数来解析四则运算表达式,下面演示一个基于正则表达式的实现。

实现原理

  1. 将四则运算表达式转换为后缀表达式;
  2. 使用数据栈存储数字,使用符号栈存储运算符;
  3. 当读取到数字时,我们将其入数据栈;
  4. 当读取到运算符时,我们将其入符号栈;
  5. 如果当前符号栈顶的运算符优先级高于待入栈的运算符,我们就可以将栈顶符号弹出,并将其与栈顶两个数字出栈进行计算;
  6. 计算结果入数据栈,直到符号栈顶的运算符优先级低于待入栈的运算符,将待入栈的运算符入栈;
  7. 重复步骤3到6,直到表达式的末尾;
  8. 最后我们将数据栈中的数字弹出,即为表达式的结果。

代码实现

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技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • JS实现json对象数组按对象属性排序操作示例

    讲解“JS实现json对象数组按对象属性排序操作示例”的完整攻略,大致分为以下步骤: 1.准备JSON对象数组数据首先,我们需要准备一组JSON对象数组数据。例如,假设我们要对一个用户列表进行排序,我们可以定义一个包含多个用户信息的数组,每个用户信息都是一个JSON对象。示例代码如下: var users = [ { name: "张三"…

    JavaScript 2023年5月27日
    00
  • Javascript中函数名.length属性用法分析(对比arguments.length)

    当我们在JavaScript中定义一个函数时,函数名上有一个属性length,它用来获取函数定义时的形参个数。这个length属性可以作为函数的一个属性被调用。 与之相似的,我们可以使用arguments.length来获取函数调用时实际传入参数的个数。下面将对这两者的用法进行详细的讲解,同时提供相应的示例。 Javascript中函数名.length属性 …

    JavaScript 2023年5月28日
    00
  • php 正确解码javascript中通过escape编码后的字符

    当我们在 JavaScript 中使用 escape() 方法对字符串进行编码后,该字符串会转换为一系列 URL 安全字符编码。而在 PHP 中,我们需要将这些 URL 安全字符编码解码为原始字符。本文将详细讲解如何正确解码 JavaScript 中通过 escape 编码后的字符。 使用 PHP 的 urldecode() 方法解码 PHP 有一个内置的 …

    JavaScript 2023年5月19日
    00
  • javascript js cookie的存储,获取和删除

    JavaScript Cookie是一种客户端存储技术,允许网站存储少量信息在客户端的浏览器中。以下是JavaScript Cookie的存储、获取和删除的详细攻略: 存储 为了存储Cookie,需要使用document.cookie属性。这个属性允许我们在客户端创建、读取和删除Cookie。以下代码展示了如何创建一个Cookie: document.coo…

    JavaScript 2023年6月11日
    00
  • 深入浅析var,let,const的异同点

    深入浅析var,let,const的异同点 在JavaScript中,我们可以使用var,let和const关键字来声明变量。这些关键字在声明变量时有着不同的作用和用法。 var 在早期的JavaScript版本中,我们只能使用var来声明变量。使用var时,变量作用域为整个函数(函数作用域)。在函数内部声明的变量在函数外部也可以被访问到。如果在函数内部声明…

    JavaScript 2023年6月11日
    00
  • 用window.onerror捕获并上报Js错误的方法

    下面是完整攻略: 什么是window.onerror? window.onerror是JavaScript的全局错误事件,它会在页面中出现JavaScript错误时触发。 为什么要用window.onerror? 使用window.onerror可以捕获和上报所发生的JavaScript错误,有助于我们及时了解并修复代码中的问题,提高网站的稳定性和用户体验。…

    JavaScript 2023年5月28日
    00
  • threejs全景图和锚点编辑的实现方案

    让我来为您详细讲解“threejs全景图和锚点编辑的实现方案”吧。 前言 在讲解实现方案前,需要了解一下全景图和锚点的基本概念。 什么是全景图? 全景图是一种圆形或球形的图像,可以通过鼠标或手指的滑动来改变视角,从而可以在360度范围内观察场景中的所有细节,给人带来身临其境的感觉。 什么是锚点? 锚点是指在全景图中设置的一个或多个可点击的点,当用户点击锚点时…

    JavaScript 2023年6月11日
    00
  • jscript读写二进制文件的方法

    当需要读写二进制文件时,我们可以使用JScript创建文件系统对象来处理这些操作。以下是使用JScript读写二进制文件的方法攻略: 1. 以二进制方式打开文件 在JScript中,我们可以使用FileSystemObject对象来读写文件。为了打开二进制文件,我们需要使用fsObj.OpenTextFile()方法,并将第二个参数设置为2。 var fso…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部