表达式求值

来源:互联网 发布:汽车销售软件有哪些 编辑:程序博客网 时间:2024/06/05 04:50

波兰表达式(用栈)

#include<iostream>#include<cstdio>#include<cstring>//后缀表达式 using namespace std;int main(){    long long int num[20];    char s[20];    int pos;    while(cin>>s){        int result=0;        if(isdigit(s[0])){            result=s[0]-'0';            int len=strlen(s);            if(len>1)            for(int i=1;i<len;i++){                result=result*10+s[i]-'0';            }            //result=atof(s);            num[pos++]=result;          }        if(s[0]=='+')   {num[pos-2]=num[pos-1]+num[pos-2];pos--;}        if(s[0]=='-')   {if(s[1]=='\0'){num[pos-2]=num[pos-1]-num[pos-2];pos--;}int temp=0;int leng=strlen(s);for(int i=1;i<leng;i++)temp=temp*10+s[i];num[pos++]=-temp;}        if(s[0]=='*')   {num[pos-2]=num[pos-1]*num[pos-2];pos--;}        if(s[0]=='/')   {num[pos-2]=num[pos-1]/num[pos-2];pos--;}    }    printf("%I64d\n",num[0]);    return 0;}

逆波兰表达式(递归)

#include<iostream>#include<cstdio>#include<cstdlib>using namespace std;double exp(){    char s[10];//浮点数的输入      cin>>s;    switch(s[0]){        case '+': return exp()+exp();        case '-': if(s[1]=='\0')return exp()-exp();else return atof(s);        case '*': return exp()*exp();        case '/': return exp()/exp();        default: return atof(s);//将字符串 转换为 双精度浮点数         break;    }}int main(){    printf("%lf\n",exp());    return 0;}

中缀表达式(递归)

#include<iostream>#include<cstdio>using namespace std;char s[1000];int pos=0;int expression();int term();int factor();int main(){    cin>>s;    printf("%d",expression());    return 0;}int expression(){    int result=term();    if(s[pos]=='+'){        pos++;        result+=term();    }    if(s[pos]=='-'){        pos++;        result-=term();    }    return result;}int term(){    int result=factor();    if(s[pos]=='*'){        pos++;        result*=factor();    }    if(s[pos]=='/'){        pos++;        result/=factor();    }    return result;}int factor(){    int result=0;    if(s[pos]=='('){        pos++;        result+=expression();        pos++;    }    while(isdigit(s[pos])){        result=result*10+s[pos]-'0';        pos++;    }    return result;}
0 0
原创粉丝点击