JavaScript 解析数学表达式的过程详解

目录
  • 概要
  • 问题
  • 拆解问题
  • 解决问题
    • 从左到右计算
    • 计算
    • 从左到右
    • + -拆分左右
    • * /拆分左右
    • ()整体
  • 优化
  • 完整代码
  • 总结

概要

本文以一个 的解题思路,来分享如何解决问题。

解决的过程,可以作为解决工作中一般问题的通用思路。

希望同学有所收获。

问题

通过JS解析数学表达式字符串。

(1 + (2 - (3 * 4 / 5 + 6 - (7 + 8))) + (9 - 10) * 11 + 12) + 13

表达式中包含基本的数学运算符号+-*/()小括号,数字都是正整数。

下面记录了个人的思考过程。

拆解问题

正常在做数学运算的时候,一般都是先进行左侧的运算,拿左边的运算结果继续和右边的继续运算。从左到右运算时,可能会遇到不同的操作符。

  • 如果遇到+-,直接对运算符左右两侧数字进行加减运算,拿到结果后和下一个继续运算。
  • 如果遇到了*/,则优先计算乘除,在进行加减运算。
  • 如果遇到了 () ,则小括号内的表达式被视为一个整体参与运算,在得到运算结果后再参与小括号外的运算。

以上是对一个程序问题场景的拆分,我们可以得到下面几个原则

  • 运算是从左到右。
  • 表达式中+-,直接拆分成左右两个
  • 表达式中*/,则*/可以被视为一个整体做优先计算。如都是*/同上。
  • 表达式中(),被视为一个整体

JS解析数学表达式,被拆解为上面的四个原则,即是我们需要解决的问题。所以在遇到一个大的问题时,我们第一步应该是对问题进行拆解

在对一个个小问题进行解答的时候,我们就把一个大的问题解决了。

下面逐一解决这四个问题。

解决问题

从左到右计算

从左到右计算,有两个关键点从左到右计算

计算

我们先分析计算,在进行+ - * /计算时,即利用运算符号对两侧数字进行运算。下面用一个图表示下1+2

这样就确定了一个运算操作的基本数据结构,即二叉

(0)

相关推荐

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

    在编写代码时我们有时候会碰到需要自己解析四则运算表达式的情况,本文简单的介绍使用JavaScript实现对简单四则运算表达式的解析. 一.熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4).也就是我们最常用的算术表达式,中缀表达式对于人类来说比较容易理解,但是不易于计算机解析. 逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式

  • JavaScript正则表达式校验与递归函数实际应用实例解析

    JS递归函数(菲波那切数列) 实例解析: 一组数字:0 1 1 2 3 5 8 13 0 1 2 3 4 5 6 7 sl(0)=0; sl(1)=1; sl(2)=sl(0)+sl(1); sl(3)=sl(1)+sl(2); function sl(i){ if(i==0){ return 0; }else if(i==1){ return 1; }else{ return sl(i-1)+sl(i-2); } } 正则表达式检验 //校验是否全由数字组成 function isDigit(

  • JS 有名函数表达式全面解析

    Example #1: Function expression identifier leaks into an enclosing scope 实例1:函数表达式标示符渗进了外围作用域 var f = function g(){}; typeof g; // "function" Remember how I mentioned that an identifier of named function expression is not available in an enclosi

  • JavaScript中的正则表达式解析

    JavaScript中的正则表达式解析 正则表达式(regular expression)对象包含一个正则表达式模式(pattern).它具有用正则表达式模式去匹配或代替一个字符串(string)中特定字符(或字符集合)的属性(properties)和方法(methods).要为一个单独的正则表达式添加属性,可以使用正则表达式构造函数(constructor function),无论何时被调用的预设置的正则表达式拥有静态的属性(the predefined RegExp object has s

  • JavaScript 正则表达式解析

    JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp对象,也可以用 JavaScript 1.2中的新添加的一个特殊语法来创建RegExp对象.就像字符串直接量被定义为包含在引号内的字符一样,正则表达式直接量也被定义为包含在一对斜杠 (/)之间的字符.所以,JavaScript可能会包含如下的代码

  • JavaScript 解析数学表达式的过程详解

    目录 概要 问题 拆解问题 解决问题 从左到右计算 计算 从左到右 + -拆分左右 * /拆分左右 ()整体 优化 完整代码 总结 概要 本文以一个 的解题思路,来分享如何解决问题. 解决的过程,可以作为解决工作中一般问题的通用思路. 希望同学有所收获. 问题 通过JS解析数学表达式字符串. (1 + (2 - (3 * 4 / 5 + 6 - (7 + 8))) + (9 - 10) * 11 + 12) + 13 表达式中包含基本的数学运算符号+ . - . * . /和()小括号,数字都是

  • JavaScript代码异常监控实现过程详解

    这篇文章主要介绍了JavaScript代码异常监控实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JavaScript异常一般有两方面:语法错误和运行时错误.两种错误的捕获和处理方式不同,从而影响具体的方案选型.通常来说,处理JS异常的方案有两种:try...catch捕获 和 window.onerror捕获.以下就两种方案分别分析各自的优劣. 虽然语法错误本应该在开发构建阶段使用测试工具避免,但难免会有马失前蹄部署到线上的时候.

  • JavaScript预编译和执行过程详解

    javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结. 首先javascript是解释型语言,自然就是编译一行,执行一行. js运行过程分为三步:1.语法分析 2.预编译

  • JavaScript实现栈结构Stack过程详解

    JavaScript实现栈结构(Stack) 一.前言 1.1. 什么是数据结构? 数据结构就是在计算机中,存储和组织数据的方式. 例如:图书管理,怎样摆放图书才能既能放很多书,也方便取? 主要需要考虑两个问题: 操作一:新书怎么插入?操作二:怎么找到某本指定的书? 常见的数据结构: 数组(Aarray)栈(Stack)链表(Linked List)图(Graph)散列表(Hash)队列(Queue)树(Tree)堆(Heap) 注意:数据结构与算法与语言无关,常见的编程语言都有直接或间接的使用

  • JS加载解析Markdown文档过程详解

    网上有很多网站会通过.md文档来做页面内容,很好奇,这是怎么做的? 出于好奇,建了一个test.md文件: # Hello World! asdfa asd *斜体文本* **粗体文本** ***斜粗体文本*** 分隔线(如下) *** * * * **** - - - ----------- GOOGLE.COM ~~删除线~~ <u>下划线</u> 用浏览器打开之后,结果就被原封不动的输出来了,浏览器根本不会解析这玩意... 跟阮老师的blog相差好大啊~呵呵~还是太天真了!

  • C#解析Lrc歌词文件过程详解

    看到很多人解析歌词文件时写了一大片的字符处理代码,而且看得不是很明白,所以自己研究了一下,  首先来了解下Lrc文件  时间格式:  1.标准格式: [分钟:秒.毫秒] 歌词  注释:括号.冒号.点号全都要求英文输入状态:  2.其他格式①:[分钟:秒] 歌词:  3.其他格式②:[分钟:秒:毫秒] 歌词,与标准格式相比,秒后边的点号被改成了冒号. 标准格式:  其格式为"[标识名:值]".大小写等价.以下是预定义的标签. [ar:艺人名] [ti:曲名] [al:专辑名]  [by:

  • javascript简单实现深浅拷贝过程详解

    前言 深浅拷贝知识在我们的日常开发中还算是用的比较多,但是之前的状态一直都是只曾听闻,未曾使用(其实用了只是自己没有意识到),所以今天来跟大家聊一聊js的深浅拷贝: 首先我们来了解一下javascript的数据类型,在ES5版本的js中我们的javascript一共有6种数据类型,分别是: Number(数值型).String(字符串).Boolean(布尔型).Object(对象,object和array都属于Object类型).null.undefined 我们日常使用的javascript

  • Javascript异步编程async实现过程详解

    async官方DOC 介绍 node安装 npm install async --save 使用 var async = require('async') js文件 https://github.com/caolan/async/tree/master/dist async提供了很多函数用于异步流程控制,下面是async核心的几个函数,完整的函数请看async官方DOC async.map(['file1','file2','file3'], fs.stat, function(err, res

  • 基于javascript处理二进制图片流过程详解

    今天学习怎么生成二维码,我习惯所有请求都用ajax完成 但是今天发现jquery的ajax不支持二进制,只能搞纯文本 于是百度之后手动实现这一功能 function getBinary(url, args, success) { var xmlhttp = new XMLHttpRequest(); var data = eval(args); var i = 0; for (var key in data) { if (i++ === 0) { url += '?' + key + "=&qu

  • JavaScript处理解析JSON数据过程详解

    JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包. JSON的规则很简单: 对象是一个无序的"'名称/值'对"集合.一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"后跟一个":"(冒号):"

随机推荐