表达式求值

来源:互联网 发布:js混淆代码后解除混淆 编辑:程序博客网 时间:2024/05/12 02:31

表达式求值

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
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<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<iostream>using namespace std;int we(char a){    switch(a)    {    case '-' :    case '+' :        return 1;        break;    case '/' :    case '*' :        return 2;        break;    case '(' :        return 0;        break;    default :        return -1;    }}int main(){    int i,j,k,n,t,top,p;    scanf("%d",&n);    while(n--)    {        int f=0,k=0;        char s[15];        char s2[1000+10],s1[1000+10];        double s4[10010];        memset(s4,0,sizeof(s4));        scanf("%s",s1);        t=strlen(s1);        int top=0;        int p=0;        for(i=0; i<t; i++)        {//            if(s1[i]=='=')//                bre            //printf("!!!%d\n",i);            if((s1[i]>='0'&&s1[i]<='9')||s1[i]=='.')            {                s[k++]=s1[i];                f=1;                continue;            }            if(f)            {                s[k]='\0';                //printf("^^^%.2lf\n",atof(s));                s4[p++]=atof(s);                //printf("%.2lf %.2lf\n",s4[0],s4[1]);                k=0;                f=0;               // printf("***%d\n",p);            }            if(s1[i]=='(')            {                s2[++top]=s1[i];            }            if(s1[i]==')')            {                while(s2[top]!='(')                {                double we;                double ni,ha;                p=p-1;                ni=s4[p];                ha=s4[--p];                if(s2[top]=='+')                {                    we=ni+ha;                    s4[p++]=we;                }                if(s2[top]=='-')                {                    we=ha-ni;                    s4[p++]=we;                }                 if(s2[top]=='*')                {                    we=ha*ni;                    s4[p++]=we;                }                if(s2[top]=='/')                {                    we=ha/ni;                    s4[p++]=we;                }                    --top;                }                --top;            }             if(s1[i]=='/'||s1[i]=='*'||s1[i]=='-'||s1[i]=='+')            {                while(we(s1[i])<=we(s2[top]))                {                double we;                double ni,ha;                p=p-1;                ni=s4[p];                ha=s4[--p];                if(s2[top]=='+')                {                    we=ni+ha;                    s4[p++]=we;                }                if(s2[top]=='-')                {                    we=ha-ni;                    s4[p++]=we;                }                if(s2[top]=='*')                {                    we=ha*ni;                    s4[p++]=we;                }                if(s2[top]=='/')                {                    we=ha/ni;                    s4[p++]=we;                }                    --top;                }                s2[++top]=s1[i];            }            if(s1[i]=='=')                break;        }        //printf("%c\n",s2[top]);        //printf("$%.2lf %.2lf\n",s4[0],s4[1]);        while(top>=1)        {                double we;                double ni,ha;                p=p-1;                ni=s4[p];                ha=s4[--p];                if(s2[top]=='+')                {                    we=ni+ha;                    s4[p++]=we;                }                if(s2[top]=='-')                {                    we=ha-ni;                    s4[p++]=we;                }                if(s2[top]=='*')                {                    we=ha*ni;                    s4[p++]=we;                }                if(s2[top]=='/')                {                    we=ha/ni;                    s4[p++]=we;                }            --top;            if(s2[1]=='(')                break;        }printf("%.2lf\n",s4[p-1]);    }    return 0;}

0 0
原创粉丝点击