只能按照顺序挨个取吧使用Split 试试看

解决方案 »

  1.   

    用stack, 把数字放进stack,遇到操作符,从stack中pop出来做运算,然后再push到stack,具体参照数据结构中的后缀表达式
      

  2.   

    我编写过一个,不过是在vc下的。要先改为c#的语法String 改为string 等等;
    用的时候用loadexp(string)读入你的表达式;
    然后用string getresult()返回的到结果;mfc下通过编译可以运行,有表达式纠错功能。
    运算符号有+ - * / ^ sin() cos() tan() ln() () 任意的组合或嵌套class supermath{
    public:
        int deadline;
        CString errormsg;
    CString expstr;
        CString thesign;
        float runstr(CString,int);
        int isdigits(CString);
        void xtrim(CString*);
        void prerun(CString*);
    CString getresult();
    void loadexp(CString);
    };void supermath::loadexp(CString str){
        expstr=str;
    }int supermath::isdigits(CString str)
    {
        int i,is=1;
    char *t=str.GetBuffer(str.GetLength());
    for (i=0;i<(int)strlen(t);i++)
        if (!((*(t+i)>='0' && *(t+i)<='9') || *(t+i)=='.' || (*(t+i)=='-' && i==0))) is=0;
    return is;
    }void supermath::xtrim(CString *str)
    {
        char *t=str->GetBuffer(str->GetLength());
    int level=0,isdotrim=1;
    for(int i=0;i<(int)strlen(t)-1;i++)
    {
        if (*(t+i)=='(') level++;
            if (*(t+i)==')') level--;
    if (level==0) isdotrim=0;
    }
        if ((isdotrim)&&strlen(t)>1) 
    {
    *str=str->Mid(1,str->GetLength()-2); 
        xtrim(str);    
    }
    }void supermath::prerun(CString *str){
        int level=0,i;
    for(i=0;i<str->GetLength();i++){
        if (str->Mid(i,1)=='(') level++;
            if (str->Mid(i,1)==')') level--;
    }
    if (level!=0) errormsg="括号请成对!";
    str->Replace("tg","tan");
    }float supermath::runstr(CString str,int maxtime)
    {
    float midvar;
    int i,j,level;
    if (errormsg!="") return 2;
    if (maxtime>deadline) {
    errormsg="expression fleat!!";
        return 2;
    }
    xtrim(&str);
    if (isdigits(str)) return (float)atof(str.GetBuffer(str.GetLength()));
        else {
    char *exp=str.GetBuffer(str.GetLength());
    char *sign=thesign.GetBuffer(str.GetLength());
            for(i=0;i<10;i++){
    level=0;
        for(j=0;j<str.GetLength()-1;j++)
    {
    if (*(exp+j)=='(') level++;
    if (*(exp+j)==')') level--;
    if (str.Mid(j,1)==thesign.Mid(i,1) && level==0) {
    CString str1=str.Mid(0,j);
                        CString str2=str.Mid(j+1);
    switch (*(sign+i))
    {
    case '+':
                            return runstr(str1,maxtime+1)+runstr(str2,maxtime+1);break;
    case '-':
    if (str1=="") midvar=0; else midvar=runstr(str1,maxtime+1);
                            return midvar-runstr(str2,maxtime+1);break;
    case '*':
                            return runstr(str1,maxtime+1)*runstr(str2,maxtime+1);break;
    case '/':
    midvar=runstr(str2,maxtime+1);
    if (midvar==0)  {errormsg+=" '/0'形错误 位置:‘"+str+"’<-err..  "; return 2;}
    return runstr(str1,maxtime+1)/midvar; break;
    case '^':
    midvar=(float)pow(runstr(str1,maxtime+1),runstr(str2,maxtime+1));
    if ((midvar+1)==midvar) { errormsg+=" '-x^0.5'形错误 位置:‘"; errormsg+=str; errormsg+="’<-err..  "; return 2; }
    return midvar; break;
    case 'i': 
    return (float)sin(runstr(str2.Mid(1),maxtime+1));break;
    case 'c':
    return (float)cos(runstr(str2.Mid(2),maxtime+1));break;
    case 't':
    midvar=(float)tan(runstr(str2.Mid(2),maxtime+1));
    if ((midvar+1)==midvar) {errormsg+=" 'tan(pi/2)'形错误 位置:‘"+str+"’<-err..  "; return 2;} 
        return midvar; break;
    case 'b':
    return (float)fabs(runstr(str2.Mid(1),maxtime+1));break;
    case 'l':
    midvar=runstr(str2.Mid(1),maxtime+1);
    if (midvar<=0)  {errormsg+=" 'ln-'形错误 位置:‘"+str+"’<-err..  "; return 2;} 
    return (float)log(midvar); break;
    default:
    errormsg+=" 内部未知错误!";
    }
    }
    }
    }
    }
    errormsg+="含有未知运算符 位置:‘"+str+"’<-err.. ";
    return 2;
    }
    CString supermath::getresult()
    {   
    deadline=10;
        errormsg="";
    thesign="+-/*^ictbl";
    errormsg="";
    CString str; prerun(&expstr);
    str.Format("%f",runstr(expstr,1));
    if (errormsg=="") return str; else return errormsg;
    }