wuwuw,好难的问题,
当然如果只是几个+-*/,可以自己做一个类,
用case,if..else,当然或者还有tree结构来处理优先级。
但是如果怎样计算一个表达式,以前也想过这个问题,
好象要针对编译器的原理,难呀,不知C#能否处理,建议:
if(考虑通用表达式)
let it be!!;
else
{
// +-*/
做一个类,先考虑简单的情况,不考虑优先级,即自己控制自己的语法,把用*,/的地方用()来增进优先级。当然,你也可以考虑优先级,
用算法来实现。
}
当然如果只是几个+-*/,可以自己做一个类,
用case,if..else,当然或者还有tree结构来处理优先级。
但是如果怎样计算一个表达式,以前也想过这个问题,
好象要针对编译器的原理,难呀,不知C#能否处理,建议:
if(考虑通用表达式)
let it be!!;
else
{
// +-*/
做一个类,先考虑简单的情况,不考虑优先级,即自己控制自己的语法,把用*,/的地方用()来增进优先级。当然,你也可以考虑优先级,
用算法来实现。
}
public int IndexOf( string value)这个函数可以得到指定字符在字符串中的索引值。
这个public string Substring(int statindex, int length)这个可以得到运算数。
string a = “(1+1)*3-2”;
int spacePos = a.IndexOf('+‘);//得到‘ )’的索引值。
string op1 = a.SubString(1, sacePos-1); 得到第一个运算数。
int spacePos1 = a.IndexOf(')');
string op2 = a.SubString(opcePos+1, opacePos1-1)//得到第二个运算数。
一般第一个括号后面就是第一个运算数,第一个运算数长度加1就是第一个运算符号。
第一个运算符后面就是第二个运算数,第二个运算数后面就是括号或是运算符
后面的同理呀! 你仔细想一下看看运算符号和括号在字符串的位置就出来了。
你参考下吧!
如果谁要的话留个email吧。
这是数据结构的内容。
BTW: 利用C#的reflection机制,可以使这种表达式求值程序更加generative.
1、首先置操作数栈为空栈,表达式起始符“#”为运算栈的栈底元素;
2、依次读入表达式中的每个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)