wuwuw,好难的问题,
当然如果只是几个+-*/,可以自己做一个类,
用case,if..else,当然或者还有tree结构来处理优先级。
但是如果怎样计算一个表达式,以前也想过这个问题,
好象要针对编译器的原理,难呀,不知C#能否处理,建议:
if(考虑通用表达式)
   let it be!!;
else 
   {
     // +-*/
     做一个类,先考虑简单的情况,不考虑优先级,即自己控制自己的语法,把用*,/的地方用()来增进优先级。当然,你也可以考虑优先级,
用算法来实现。
    }

解决方案 »

  1.   

    用这两个函数可以否!
    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就是第一个运算符号。
    第一个运算符后面就是第二个运算数,第二个运算数后面就是括号或是运算符
    后面的同理呀!  你仔细想一下看看运算符号和括号在字符串的位置就出来了。
    你参考下吧!
      

  2.   

    我五一正好做了一个分数类以及表达式解析,用c++,然后用Managed Extention for C++写了个wrapper class,就能够放到c#里用了,做一下广告:)
    如果谁要的话留个email吧。
      

  3.   

    除了script的eval以外,没有什么语言会提供对表达式分析的直接支持。
    这是数据结构的内容。
    BTW: 利用C#的reflection机制,可以使这种表达式求值程序更加generative.
      

  4.   

    用栈基本思想是这样:使用两个工作栈。一个叫OPND,用以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。
    1、首先置操作数栈为空栈,表达式起始符“#”为运算栈的栈底元素;
    2、依次读入表达式中的每个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)