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获取字符串字节数方法小结

    以下是关于“js获取字符串字节数方法小结”的完整攻略。 什么是字符串字节数? 在计算机中,一个字节(byte)是计量单位,表示一个8位元组。而在字符串中,每个字符都对应1个或多个字节。因此,字符串字节数(英文:byte length)是衡量一个字符串占据的存储空间大小的指标。在某些场合下,需要对字符串字节数进行操作,例如验证用户输入的字符长度是否正确。 如何…

    JavaScript 2023年5月19日
    00
  • Javascript数组及类数组相关原理详解

    Javascript数组及类数组相关原理详解 在Javascript中数组是一个非常重要的数据结构,它可以存储多个数据并进行操作。但是在实际开发中,我们还会遇到类数组对象,这些对象类似于数组但并不是数组,本文将详细介绍Javascript数组及类数组相关原理。 数组基本操作 定义数组 定义数组有两种方式,一种是通过字面量方式,另一种是通过构造函数方式。 //…

    JavaScript 2023年5月27日
    00
  • 服务器端C#实现的CSS解析器

    服务器端C#实现的CSS解析器攻略 简介 服务器端C#实现的CSS解析器可以帮助我们在服务器端解析CSS文件,方便我们对于CSS文件进行修改、分析、压缩以及提取样式等操作。在本篇攻略中,我们将会讲解如何使用C#实现CSS解析器,以及其中的两个示例应用。 实现步骤 以下是使用C#实现CSS解析器的步骤: 安装NuGet包“CssParser”,该NuGet包是…

    JavaScript 2023年5月28日
    00
  • fastclick插件导致日期(input[type=”date”])控件无法被触发该如何解决

    首先,需要梳理一下问题的背景和现象: 背景:当网页中使用了fastclick插件时 现象:用户在点击日期选择控件时,控件无法弹出日期选择框,无法选择日期。 这是因为fastclick插件会阻止浏览器默认的双击事件(有些日期选择控件在点击两次时才能弹出)和移动端的300ms延迟,从而提升点击体验。然而这个插件的实现方式是,将点击事件改为tap事件,从而可能会对…

    JavaScript 2023年6月11日
    00
  • JSONObject与JSONArray使用方法解析

    JSONObject与JSONArray使用方法解析 在Java开发中,我们经常需要操作JSON格式数据,而Java提供了两个类来操作JSON数据,分别是JSONObject和JSONArray。 JSONObject JSONObject是JSON的对象表示法,在Java中,我们可以使用JSONObject来构建一个JSON对象。 创建JSONObject…

    JavaScript 2023年6月11日
    00
  • jQuery中ajax的get()方法用法实例

    下面是“jQuery中ajax的get()方法用法实例”的完整攻略。 简介 在 jQuery 中,我们可以使用 ajax 功能从服务器获取数据。而 get() 方法是 ajax 功能中常用的方法,它会向服务器发送一个 get 请求,获取指定的数据并返回它们。 get() 方法基本用法 $.get(url, [data], [callback], [type]…

    JavaScript 2023年6月11日
    00
  • 一文详解如何根据后端返回的url下载json文件

    下面是详细讲解如何根据后端返回的url下载json文件的完整攻略: 方式一:使用Python实现 1. 安装必要的库 首先,我们需要安装requests库,用于发送HTTP请求: pip install requests 2. 发送请求获取JSON数据 接下来,我们需要使用requests库发送HTTP请求获取JSON数据: import requests …

    JavaScript 2023年6月11日
    00
  • JS闭包与延迟求值用法示例

    JS闭包和延迟求值是JS中比较重要的概念,也是面试中常被问到的问题。下面我将给出JS闭包与延迟求值的完整攻略,并针对两个具体的示例进行说明。 一、JS闭包 1.1 什么是闭包 在JS中,闭包就是能够读取其他函数内部变量的函数。简单来说,闭包就是“内部函数记住并访问其外部作用域的能力”。 1.2 闭包的形成与作用 闭包的形成有两个条件:内部函数必须在外部函数内…

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