已知用户输入的一个表达式类型的字符串例如(3+4)*5或(2+4)/3一个程序接收这个字符串后输出其运算的结果。这个程序该怎么写?

解决方案 »

  1.   

    这就是表达式的解析
    两种方案,一种利用堆栈+符号优先级进行处理
    另外一种利用递归~写计算器的时候用过后一种,你可以参考下
    http://blog.sina.com.cn/s/blog_4ab057eb0100aopz.html
    http://blog.sina.com.cn/s/blog_4ab057eb0100b0vp.html
      

  2.   

    嗯,可以用栈解决,但是如果我从stack中取出一个+,这是这个+是一个运算符还是一个字符?
    是不是可以写成这样char i='+';
    如果我要用+来连接3和5,是不是可以这样写:int  n=3i5;
    如果不能,那又该怎么写呢?
      

  3.   

    这是我以前写得c++代码,你可以看看,就是利用堆栈+符号优先级进行处理的:
    #include<iostream>
    using namespace std;
    template<class T>
    class seqstact
    {
    private:
    T *element;
    int size;
    int top;
    public:
    seqstact(int size=64);
    ~seqstact();
    bool isEmpty();
    void push(T x);
    T pop();
    T get();
    };
    template <class T>
    seqstact<T>::seqstact(int size)
    {
    size=size<64?664:size;
    element=new T[size];
    top=-1;
    }
    template <class T>
    seqstact<T>::~seqstact()
    {
    delete [] element;
    }
    template<class T>
    bool seqstact<T>::isEmpty()
    {
    return top==-1;
    }
    template<class T>
    void seqstact<T>::push(T x)
    {
    if(top==size-1)
    {
    T *temp=element;
    element=new T[size*2];
    for(int i=0;i<size;i++)
    element[i]=temp[i];
    size*=2;
    }
    top++;
    element[top]=x;
    }
    template<class T>
    T seqstact<T>::pop()
    {
    if(!isEmpty())
    {
    T x=element[top];
    top--;
    return x;
    }
    else 
    throw "空栈,不能执行出栈操作";
    }
    template<class T>
    T seqstact<T>::get()
    {
    if(!isEmpty())
    return element[top];
    else
    throw "空栈,不能执行出栈操作";
    }
    char *topostfix(char *expstr)
    {
    seqstact<char> stact;
    char *postfix=new char[strlen(expstr)*2];
    int i=0;
    int j=0;
    char out;
    while(expstr[i]!='\0')
    {
    switch(expstr[i])
    {
    case '+':
    case '-':
    {
    while(!stact.isEmpty()&&stact.get()!='(')
    postfix[j++]=stact.pop();
    stact.push(expstr[i++]);
    break;
    }
    case '*':
    case '/':
    {
    while(!stact.isEmpty()&&(stact.get()=='*'||stact.get()=='/'))
    postfix[j++]=stact.pop();
    stact.push(expstr[i++]);
    break;
    }
            case '(':stact.push(expstr[i++]);break;
    case ')':
    {
    out=stact.pop();
    while(!stact.isEmpty()&&out!='(')
    {
    postfix[j++]=out;
    out=stact.pop();
    }
    i++;
    break;
    }
    default:
    {
    while(expstr[i]>='0'&&expstr[i]<='9'&&expstr[i]!='\0')
    postfix[j++]=expstr[i++];
    postfix[j++]=' ';
    break;
    }
    }
    }
    while(!stact.isEmpty())
    postfix[j++]=stact.pop();
    postfix[j]='\0';
    return postfix;
    }
    int value(char *postfix)
    {
         seqstact<int> stact;
     int i=0,result=0;
     
     while(postfix[i]!='\0')
     {
     if(postfix[i]>='0'&&postfix[i]<='9')
     {
     result=0;
     while(postfix[i]!=' ')
     {
     result=result*10+postfix[i++]-'0';
     }
     i++;
     stact.push(result);
     }
     else
     {
     if(postfix[i]!=' ')
     {
     int y=stact.pop();
     int x=stact.pop();
     switch(postfix[i])
     {
         case '+':result=x+y;break;
                         case '-':result=x-y;break;
     case '*':result=x*y;break;
         case '/':result=x/y;break;
     }
     stact.push(result);
     }
     i++;
     }
     }
     return stact.pop();
    }
    int main()
    {
    char*expstr="121+10*(53-49+20)/((35-25)*2+10)";
    char*postfix=topostfix(expstr);
    cout<<"expstr=  "<<expstr<<endl;
    cout<<"postfix=  "<<postfix<<endl;
    cout<<"value=  "<<value(postfix)<<endl;
    return 0;
    }
      

  4.   

    import javax.script.*;
    public class TestScript {
    public static void main(String[] args) throws Exception {
    String exp = "(1*2)+3/4+5^2";

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");
    Object result = engine.eval(exp);

    System.out.println("结果类型:" + result.getClass().getName() + ",计算结果:" + result);
    }
      

  5.   

    现在表达式引擎那么多,效率也很好,无需自己写
    ScriptEngineManager是jdk1.6中才有的,如果在1.5中使用,可以下载bsf-apijexl,使用jexl这个表达式引擎来计算,代码只需将上面的js改成jexl就OK,如果使用js也没问题,下载一个js引擎
      

  6.   

    javascript中^是什么运算它就是什么运算,可以肯定不是平方