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

yizhihongxing

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日

相关文章

  • 详解如何在JavaScript中使用for循环

    以下是“详解如何在JavaScript中使用for循环”的完整攻略。 1. for循环简介 for循环是一种在JavaScript中常用的循环结构,也是最基本的三种循环结构之一。for循环支持设置循环条件、循环执行语句和循环计数器的初始值,用于重复执行相同的代码块。 一般来说,for循环的语法结构如下: for (initialization; condit…

    JavaScript 2023年5月28日
    00
  • JavaScript实现数字前补“0”的五种方法示例

    JavaScript实现数字前补“0”是一个常见的需求。在编程中,我们经常需要对数字进行前补“0”的操作,以匹配字符串的长度或者满足数据格式的要求。本文将详细讲解五种JavaScript实现数字前补“0”的方法示例。 方法一:字符串拼接 其实,这是最常见的一种方法。可以将数字字符与“0”字符进行拼接,再将结果转换为字符串。拼接前需要判断数字是否占位够用。代码…

    JavaScript 2023年5月28日
    00
  • Js实现累加上漂浮动画示例

    我来为你详细讲解 “Js实现累加上漂浮动画示例” 的完整攻略。 1. 实现累加功能 1.1 创建HTML结构 首先,我们需要在HTML中创建相应的元素结构。其中包括两个数字框(累加器和动画器),以及一个”开始动画”按钮,代码如下: <div> <span>累加器:</span> <input type="t…

    JavaScript 2023年6月10日
    00
  • 在JavaScript中操作时间之getMonth()方法的使用

    当需要在JavaScript中操作时间时,一个常见的需求是获取当前时间的月份。这时可以使用JavaScript中的Date对象,并结合getMonth()方法来获取月份信息。下面详细讲解一下如何使用getMonth()方法。 1. getMonth()方法简介 getMonth()方法是Date对象的一个方法,用于获取当前时间的月份信息。getMonth()…

    JavaScript 2023年5月27日
    00
  • JavaScript RegExp 正则表达式对象详细说明

    JavaScript RegExp 正则表达式对象详细说明 什么是正则表达式 正则表达式是一种用于处理字符串的表达式。它可以通过匹配字符的组合来实现对字符串的模式匹配,验证输入数据的有效性等。 RegExp 构造函数 RegExp 构造函数是用来创建一个 RegExp 对象的。它可以接受两个参数,分别是正则表达式字符串和修饰符字符串。正则表达式字符串用来定义…

    JavaScript 2023年6月10日
    00
  • 一个查看session内容的函数

    来介绍一下如何编写一个查看 session 内容的函数。 1. 编写函数头部和注释 我们首先需要定义函数的名称和参数,以及函数的用途、功能等相关注释信息。示例代码如下: def show_session(session): """ 显示 session 内容的函数 :param session: Flask 中的 session…

    JavaScript 2023年6月11日
    00
  • JS实现n秒后自动跳转的两种方法

    下面我将针对“JS实现n秒后自动跳转的两种方法”进行详细讲解。 方法一:使用setTimeout()方法 我们可以使用JS的setTimeout()方法来实现n秒后自动跳转,具体操作步骤如下: 在页面中添加JS代码,定义计时器,并使用setTimeout()方法来实现需要跳转的URL地址。 <script> // 设置跳转的URL地址 var t…

    JavaScript 2023年5月27日
    00
  • JS中实现简单Formatter函数示例代码

    下面就JS中实现简单Formatter函数示例代码的完整攻略进行讲解。 1. 简单Formatter函数实现 Formatter函数的作用是将一个字符串中的指定位置的字符换成其他字符,函数的参数包含原字符串,需要替换的字符的位置,原来的字符和替换的字符。下面是一个示例代码: function formatter(str, idx, oldChar, newC…

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