浅谈中缀表达式的求值(带符号,等于,不等于,大于,小于,与,或,非,等等)
2006-08-30 21:30
246 查看
浅谈中缀表达式的求值
我们知道中缀表达式的求值,通常都是先转换为后缀表达式,在通过堆栈求出后缀表达式的值,对于这点,如果有不太清楚的请参见:http://202.113.89.254/DataStructure/DS/web/zhanhuoduilie/zhanhuoduilie3.3.1.htm(原理)
http://tech.ccw.com.cn/article/252014.htm(实现)
对于ChinaDHF的这篇“中缀表达式到逆波兰表达式的转换及求值”写的很清楚,但他没有对符号处理,更没有对布尔运算进行判断。在这里,我们来看看怎么来完善他的这篇文章。
下面是ChinaDHF的代码的结构。
1.对中缀表达式进行语法分析,或称合法性检查。
2.将中缀表达式转换为逆波兰表达式。
3.计算逆波兰表达得到我们想要的值。
我们照久,首先检查合法性。
为了方便后面的运算,我们先要做一个替换,把所有只能用字符串表示的运算符号,都替换成一个字符(char)的形式。
public static string RexStringWord = @"[#&|!+=<>.- *()/÷òó]";
public static string RexStringNumber = @"-?(\d+\.?\d*)";
public static string RexStringLining = @"[(]#[+\-*><=&|÷òó]+#[)]";
public static string RexStringExp = @”([#][+\-*><=&|÷òó])+[#] ";
在合法性检查里面,我们把所有的数字(带负号,不带负号,带小数,不带小数)用正则表达式RexStringNumber都替换成#号
替换后表达式里面就只存在类似” #+#-# “,” #*(#-#) “,”(#<#)” 等等的了。在用正则表达式RexStringLining替换掉所有带括号的,最后用RexStringExp替换掉不带括号的,于是最后剩下的只会是#号
运算符的优先级比较:这里统一采用char类型做参数,所有前面出现运算符的单字符转化
上面这些,我做了一定的修改,简化了一下,本来布尔运算只会出现在IF语句里面,在这里我把IF的处理去掉了,IF处理很简单的,把条件语句单独提出来,判断,如果是true就执行THEN块,否则执行ELSE块
我觉得我正则表达式写的不好,算法上也有不好的地方,希望高手指教。
相关文章推荐
- 大于、等于、小于等符号转换
- mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)
- mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)
- mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)
- mybatis的一些特殊符号标识(大于,小于,等于,不等于)
- mybatis的一些特殊符号标识(大于,小于,等于,不等于)
- mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)
- MyBatis 处理sql中的 大于,小于,大于等于,小于等于
- linux shell中 if else以及大于、小于、等于逻辑表达式介绍
- iBATIS sql(XML)中的大于、小于、like等符号写法
- 求MySQL先按大于等于当前时间升序排序,再按小于当前时间降序排序
- 栈的应用:表达式求值(可以算大于等于10的数哦!)
- 本不应存在的数字..有没有既不大于等于0又不小于0的数
- shell脚本中大于,大于等于,小于,小于等于、不等于的表示方法
- 网易2018笔试-正整数对(x,y),x,y都小于等于n,x/y大于等于k。
- linux shell中 if else以及大于、小于、等于逻辑表达式介绍
- 如果大于等于80分,小于等于100分的同学评级为A,小于80分为B.
- [shell] if else以及大于、小于、等于逻辑表达式
- 求方程 的根,用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。
- JSP中EL表达式使用大于小于等符号