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

java输入的也许很简单的有关问题,给200分吧

2012-03-16 
java输入的也许很简单的问题,给200分吧表达式求值:30+3*(4-2.3)-3这个式子,请问该怎么正确分解成为运算符

java输入的也许很简单的问题,给200分吧
表达式求值:
30+3*(4-2.3)-3
这个式子,请问该怎么正确分解成为运算符和操作数?
我有个基本想法是:用DataInputStream来读一个byte,判断是否是数字,如果是,则放回流里面,然后以double形式重新读入一个。如果是字符,则是正常操作符。
如此直至读到末尾。
但这样做,我不知道怎么样把已经读入的字符放回流里面。

请教大家一个思路,谢谢!

[解决办法]
http://blog.csdn.net/CrazyGou/archive/2007/06/10/1646246.aspx
[解决办法]
某公司的一道面试题和这个问题是一样的,其实最简单的思路就是分解操作符,注意冗余设计就可以了。比如本题要求你计算1+1,你要考虑到01+10如何计算。说出这样的思路应该就是100分了。
[解决办法]
先消除括号,把括号用变量代替,再消除连续乘除,也用变量代替,最后剩下加减就好办了
[解决办法]
定一个!
[解决办法]
学学看看
[解决办法]
用正则表达式
[解决办法]
我也期待有更好的解决方法!!!
[解决办法]
学习
[解决办法]
学习
[解决办法]
请问正则表达式中的特殊构造中的
(?=X) (?!X) (? <=X) (? <!X) (?> X)是什么意思?
java的api中的解释看不明白
[解决办法]
路过。
[解决办法]
http://blog.csdn.net/CrazyGou/archive/2007/06/10/1646246.aspx
楼主看了吗?

分割字符串只一句正则:
String[] words = str.split( "(? <!^-?|[+/*()-]-)((? <=[+/*()-])|(?=[+/*()-])) ");
然后遍历words
if (words[i].matches( "-?\\d+|-?\\d+\\.\\d+ ")) { //操作数
...
}
else { //操作符
...
}
[解决办法]
不知道我是不是没有看明白题目,用正则式不是很好吗?
[解决办法]
顶了
[解决办法]
正则表达式。

去看看javacc。

下面是javacc中语法分析的正则表达式定义:
SKIP :
{
" "
| "\t "
| "\n "
| "\r "
| < "// " (~[ "\n ", "\r "])* ( "\n "| "\r "| "\r\n ")>
| < "/* " (~[ "* "])* "* " (~[ "/ "] (~[ "* "])* "* ")* "/ ">
}

TOKEN : /* LITERALS */
{
< INTEGER_LITERAL:
<DECIMAL_LITERAL> ([ "l ", "L "])?
| <HEX_LITERAL> ([ "l ", "L "])?
| <OCTAL_LITERAL> ([ "l ", "L "])?
>
|
< #DECIMAL_LITERAL: [ "1 "- "9 "] ([ "0 "- "9 "])* >
|
< #HEX_LITERAL: "0 " [ "x ", "X "] ([ "0 "- "9 ", "a "- "f ", "A "- "F "])+ >
|
< #OCTAL_LITERAL: "0 " ([ "0 "- "7 "])* >
}

TOKEN : /* IDENTIFIERS */
{
< IDENTIFIER: <LETTER> ( <LETTER> | <DIGIT> )* >
|
< #LETTER: [ "_ ", "a "- "z ", "A "- "Z "] >
|


< #DIGIT: [ "0 "- "9 "] >
}

SimpleNode Start() : {}
{
Expression() "; "
{ return jjtThis; }
}


void Expression() : {}
{
AdditiveExpression()
}

void AdditiveExpression() : {}
{
MultiplicativeExpression() ( ( "+ " | "- " ) MultiplicativeExpression() )*
}

void MultiplicativeExpression() : {}
{
UnaryExpression() ( ( "* " | "/ " | "% " ) UnaryExpression() )*
}

void UnaryExpression() : {}
{
"( " Expression() ") " | Identifier() | Integer()
}

void Identifier() : {}
{
<IDENTIFIER>
}

void Integer() : {}
{
<INTEGER_LITERAL>
}
[解决办法]
关注
[解决办法]
路过 看看
[解决办法]
我还是比较支持先读到字符串里再用正则表达式,至于优先及在正则表达式匹配时可以按照一定的先后来读取.

热点排行