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日

相关文章

  • Chart.js功能与使用方法小结

    Chart.js功能与使用方法小结 什么是Chart.js Chart.js是一款简单灵活的JavaScript图表库,可以用于绘制各种类型的图表,包括线图、柱状图、雷达图、饼图等等。Chart.js基于HTML5的Canvas元素实现,具有良好的兼容性和性能优势。 安装与引入 在使用Chart.js之前,需要先进行安装和引入。可以通过以下方式进行安装: n…

    JavaScript 2023年6月11日
    00
  • JavaScript 获取当前时间戳的代码

    获取当前时间戳是指获取当前时间与某一特定时间(一般为1970年1月1日00:00:00 UTC)之间的毫秒数。JavaScript提供了多种方法来获取当前时间戳。 Date对象的getTime()方法 在JavaScript中,Date对象提供了getTime()方法来获取当前时间戳。该方法返回自1970年1月1日00:00:00 UTC以来的毫秒数。以下是…

    JavaScript 2023年5月27日
    00
  • Javascript如何递归遍历本地文件夹

    在JavaScript中遍历本地文件夹可以使用Node.js的文件系统(fs)模块,递归遍历需要使用递归函数来实现。 以下是完整攻略: 1. 安装Node.js 在开发环境中,需要安装最新版的Node.js来执行JavaScript代码。Node.js可以在官网上下载:https://nodejs.org/。 2. 引入fs模块 在Node.js中,提供了一…

    JavaScript 2023年5月27日
    00
  • JavaScript 实现生命游戏

    JavaScript 实现生命游戏攻略 生命游戏是一个经典的细胞自动机,它是由英国数学家约翰·何顿·康威于1970年发明的。该游戏规则虽然简单,但是可玩性极高,主要涉及到生死、繁衍和群体规律等内容。 本文主要介绍了如何使用 JavaScript 实现生命游戏,分别从实现规则和游戏界面两个方面进行阐述。 实现规则 生命游戏的规则和初始状态都是在网格上的,它主要…

    JavaScript 2023年5月28日
    00
  • JS开发中基本数据类型具体有哪几种

    为了介绍 JS 开发中的基本数据类型,我们需要从以下几个方面进行介绍。 1. JS 基本数据类型 JS 中的基本数据类型有以下五种: Number(数字类型) String(字符串类型) Boolean(布尔类型) Undefined(未定义类型) Null(空类型) 这些基本数据类型在 JS 中可以通过相应关键字来定义变量,例如: let num = 12…

    JavaScript 2023年5月28日
    00
  • JS中使用DOM来控制HTML元素

    当我们使用 JavaScript 操作 DOM 时,我们实际上是在操作网页上的 HTML 元素。下面是如何使用 DOM 来控制 HTML 元素的完整攻略: 获取页面元素 要控制 HTML 元素,我们首先需要获取它们。我们可以使用以下方法: 1. getElementById() 使用 getElementById() 方法可以根据元素的 ID 属性获取元素的…

    JavaScript 2023年6月10日
    00
  • JavaScript中的this关键词指向

    JavaScript中this关键词指向是一个常被提及并且也容易出错的概念,仔细理解和学习会让我们在编写JavaScript代码时更加自如。下面就是详细的攻略。 什么是this 在JavaScript中,this是一个关键词,它指向了当前执行上下文中的一个对象。当前执行上下文可能是全局环境,也可能是某个函数的调用环境。 this的指向 在JavaScript…

    JavaScript 2023年6月11日
    00
  • JS正则中的RegExp对象对象

    下面是关于JS正则中的RegExp对象的完整讲解攻略: 1. 什么是RegExp对象 RegExp对象是JS中用来表示正则表达式的对象,它可以用来执行文本匹配和文本替换等操作,同时也可以通过其属性和方法获取和操作正则表达式对象。 2. RegExp对象的创建方法 在JS代码中,我们可以通过两种方式来创建RegExp对象: 方法一:使用字面量创建 使用字面量的…

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