nyist 35 表达式求值(后缀表达式)

来源:互联网 发布:java两个字符串compare 编辑:程序博客网 时间:2024/05/21 10:15
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
21.000+2/4=((1+2)*5+1)/4=
样例输出
1.504.00

对于这类题目通常转化为后缀表达式来计算。

两个栈:一个存值,一个存操作符:

对于操作符:

如果为‘(’:进栈

如果为‘)’:依次计算括号内表达式的值。

如果为其他:如果栈顶的优先级大于等于此字符,不断出栈运算。

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<bitset>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )typedef long long LL;typedef pair<int,int>pil;const int INF = 0x3f3f3f3f;const int maxn=1100;char str[maxn];stack<char>s;stack<double>ans;int t;int ok(char x){    if(x=='+'||x=='-') return 1;    else if(x=='*'||x=='/') return 2;    else if(x=='(')  return 0;    else  return -1;}double cal(double s1,double s2,char c){    if(c=='+') return s2+s1;    else if(c=='-') return s2-s1;    else if(c=='*') return s2*s1;    else  return s2/s1;}void solve(){    double x1=ans.top();ans.pop();    double x2=ans.top();ans.pop();    double x=cal(x1,x2,s.top());    s.pop();ans.push(x);}int main(){    scanf("%d",&t);    s.push('#');    while(t--)    {        scanf("%s",str);        int cnt=0;        while(!ans.empty()) ans.pop();        int len=strlen(str);        for(int i=0;i<len-1;i++)        {            if(str[i]>='0'&&str[i]<='9')            {                char temp[110];CLEAR(temp,0);int l=0;                while(str[i]>='0'&&str[i]<='9'||str[i]=='.')                    temp[l++]=str[i++];                double x=atof(temp);                ans.push(x);                i--;            }            else if(str[i]=='(') s.push(str[i]);            else if(str[i]==')')            {                while(s.top()!='(')                  solve();                s.pop();            }            else            {                while(ok(s.top())>=ok(str[i]))                  solve();                s.push(str[i]);            }        }        while(s.top()!='#')            solve();        printf("%.2f\n",ans.top());    }    return 0;}


0 0
原创粉丝点击