解析字符串中的逻辑表达式并进行计算——Golang 实现

栏目: IT技术 · 发布时间: 6年前

内容简介:这里只讲讲思路,具体的代码可以去我的程序支持小数形式的逻辑运算,但精度不超过3位。程序仅支持由以下运算符构成的逻辑表达式的运算:

这里只讲讲思路,具体的代码可以去我的 Github 获取。

程序支持小数形式的逻辑运算,但精度不超过3位。

程序仅支持由以下运算符构成的逻辑表达式的运算:

+ - * / == != >= > <= < ( ) && ||

第一步,对字符串中的数据进行语法检查

给定一个字符串:"4+5>=32||(2+3)==5.25"

对该字符串的语法检查包括:

  1. 对表达式元素类型检查,如:表达式中不能出现除上述运算符、0-9的数字、小数点之外的字符;
  2. 对运算数格式检查,如:小数点在运算数中出现的位置、运算数的小数位数等;
  3. 对表达式中左括号和右括号一致性检查,如:对任意一个左括号是否总有一个右括号与之对应、每对括号中是否有值;
  4. 对表达式中运算符位置合法性检查,如:运算符左侧和右侧相邻元素的类型、不能除以0等。

第二步,将中缀表达式转为前缀表达式

这里转为前缀表达式是为了方便后面的运算,主要思路如下:

  1. 分割表达式字符串;
  2. 创建一个表达式元素栈,将分割后的运算符和运算数压入栈,并对运算符划分优先级;
  3. 再创建两个栈,一个运算符栈,一个结果栈,运算符栈中初始压入一个优先级最低的运算符,解决开始时候的边界问题;
  4. 自栈顶至栈底扫描表达式元素栈,碰到运算数,就直接压入结果栈,碰到运算符,则与运算符栈顶元素比较优先级:如果该运算符优先级大于等于栈顶元素,则将该运算符压入运算符栈,否则运算符栈顶元素出栈并压入结果栈,继续比较,直到该运算符优先级大于等于栈顶元素的优先级时,将该运算符压入运算符栈中。
  5. 如果遇到右括号直接压入结果栈中,如果遇到一个左括号,就将运算符栈元素弹出并压入结果栈(注意:两个括号都不要压入结果栈);
  6. 处理完表达式后,如果运算符栈中还有元素,则将元素依次弹出并压入结果栈。

第三步,计算前缀表达式

  1. 自栈底至栈顶遍历结果栈;
  2. 遇到运算数时,将运算数压入运算数栈,遇到运算符时,弹出结果栈栈顶的两个元素,用该运算符对它们做相应的计算(栈顶元素 op 次顶元素)
  3. 将运算结果压入运算数栈;
  4. 重复上述过程直到栈顶,最后算出的值就是表达式的值。

以上所述就是小编给大家介绍的《解析字符串中的逻辑表达式并进行计算——Golang 实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法技术手册

算法技术手册

[美]海涅曼 (Heineman.G.T.)、[美]波利切 (Pollice.G.)、[美]塞克欧 (Selkow.S.) / 东南大学出版社 / 2009-4 / 58.00元

创造稳定的软件需要有效的算法,但是程序设计者们很少能在问题出现之前就想到。《算法技术手册(影印版)》描述了现有的可以解决多种问题的算法,并且能够帮助你根据需求选择并实现正确的算法——只需要一定的数学知识即可理解并分析算法执行。相对于理论来说,本书更注重实际运用,书中提供了多种程序语言中可用的有效代码解决方案,可轻而易举地适合一个特定的项目。有了这本书,你可以: 解决特定编码问题或改进现有解决......一起来看看 《算法技术手册》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换