首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

java 写一个程序 判断表达式是不是合法

2013-03-12 
java 写一个程序 判断表达式是否合法如题:【运算符包括 + - * / -(负)】如:x+y,x+y+z+(k+t)*p 这就是合法的

java 写一个程序 判断表达式是否合法
如题:【运算符包括 + - * / -(负)】
如:x+y  ,  x+y+z+(k+t)*p 这就是合法的 。
如:x++y  , x+y+(() 这就是非法的。


请问如何做?

我觉得很复杂,我所能想到的判断条件有:
1,左括号与右括号个数相同
2,两个运算符不可以相邻
3,两个数字不可以相邻
4,运算符的左边不可以是左括号,右边不可以是右括号。【如: (+ 或 +)】
5,右括号不可以在第一个位置,左括号不可以在最后一个位置。【如:)x(】
6,一对括号中间不能为空且必须为合法的表达式【如:()】

一对括号里面的内容必须是合法的,这样就可以用递归来实现


我能想到的就这么多,不够感觉是不应该这样来做,这样很复杂。
不知道大家有人做过这题没有 请告知一下  谢谢 O(∩_∩)O~


[解决办法]
你这个表达式字符串允不允许有空格?还有你的表达式中的字母表示的都是数字吗?还是变量?
while(s.matches(".*\\([0-9]+([\\+\\-\\*\\/][0-9]+)+\\).*")){
s.replaceAll("\\([0-9]+([\\+\\-\\*\\/][0-9]+)+\\)","0");
}
return s.marches("^[0-9]+([\\+\\-\\*\\/][0-9]+)+$");
假设你的字母所在位置全是数字,并且不允许有空格,用上面的代码就应该可以。
[解决办法]
如果只是括号,超级简单

放1个计数器

从表达式左边开始,每碰到一个左括号,计数器+1,没碰到一个右括号,计数器-1

1 任意时间,计数器不能为负数
2 遍历玩以后,计数器应当为0
[解决办法]
那就是超级简单了,用java自带的javascript引擎rhino。

手头没环境,纯手写的,有错的话,自己修正一下:

String expression = "...";
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
// 如果正确的表达式,返回的是个Number类型(比如Double)的对象,否则,可能返回null,或者抛出Exception
engine.eval(expression);

热点排行