这里只讲讲思路,具体的代码能够去个人Github获取。git
程序支持小数形式的逻辑运算,但精度不超过3位。
程序仅支持由如下运算符构成的逻辑表达式的运算:
+ - * / == != >= > <= < ( ) && ||
给定一个字符串:"4+5>=32||(2+3)==5.25"
对该字符串的语法检查包括:github
- 对表达式元素类型检查,如:表达式中不能出现除上述运算符、0-9的数字、小数点以外的字符;
- 对运算数格式检查,如:小数点在运算数中出现的位置、运算数的小数位数等;
- 对表达式中左括号和右括号一致性检查,如:对任意一个左括号是否总有一个右括号与之对应、每对括号中是否有值;
- 对表达式中运算符位置合法性检查,如:运算符左侧和右侧相邻元素的类型、不能除以0等。
这里转为前缀表达式是为了方便后面的运算,主要思路以下:code
- 分割表达式字符串;
- 建立一个表达式元素栈,将分割后的运算符和运算数压入栈,并对运算符划分优先级;
- 再建立两个栈,一个运算符栈,一个结果栈,运算符栈中初始压入一个优先级最低的运算符,解决开始时候的边界问题;
- 自栈顶至栈底扫描表达式元素栈,碰到运算数,就直接压入结果栈,碰到运算符,则与运算符栈顶元素比较优先级:若是该运算符优先级大于等于栈顶元素,则将该运算符压入运算符栈,不然运算符栈顶元素出栈并压入结果栈,继续比较,直到该运算符优先级大于等于栈顶元素的优先级时,将该运算符压入运算符栈中;
- 若是遇到右括号直接压入结果栈中,若是遇到一个左括号,就将运算符栈元素弹出并压入结果栈(注意:两个括号都不要压入结果栈);
- 处理完表达式后,若是运算符栈中还有元素,则将元素依次弹出并压入结果栈。
- 自栈底至栈顶遍历结果栈;
- 遇到运算数时,将运算数压入运算数栈,遇到运算符时,弹出结果栈栈顶的两个元素,用该运算符对它们作相应的计算(栈顶元素 op 次顶元素);
- 将运算结果压入运算数栈;
- 重复上述过程直到栈顶,最后算出的值就是表达式的值。