日期:2014-05-20  浏览次数:20769 次

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);