hdu1237简单表达式求值(我多判断了())

来源:互联网 发布:网易镜像站下载linux 编辑:程序博客网 时间:2024/06/16 17:27

简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21981    Accepted Submission(s): 7925


Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 

Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
 

Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
 

Sample Input
1 + 24 + 2 * 5 - 7 / 110
 

Sample Output
3.0013.36
 

Source
浙大计算机研究生复试上机考试-2006年
ps:参考算法笔记


#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <stack>#include <queue>#include <map>using namespace std;typedef long long LL;using namespace std;#define INF 0x3f3f3f3f#define mod 1000000007#define N 1100struct node{    char op;    double num;    int flog;}t,sum;char ch[N];stack<node>s;queue<node>q;map<char,int>mp;void change(){    int len=strlen(ch);    for(int i=0;i<len;) {        if(ch[i]==' ') {            i++;            continue;        }        else if(ch[i]>='0'&&ch[i]<='9') {            t.num=(ch[i]-'0');            t.flog=1;            i++;            while(ch[i]>='0'&&ch[i]<='9') {                t.num=t.num*10+ch[i++]-'0';            }            q.push(t);        }        else if(ch[i]=='('||ch[i]==')') {            if(ch[i]=='(') {                t.flog=0;                t.op='(';                s.push(t);            }            else {                while(!s.empty()&&s.top().op!='(') {                    q.push(s.top());                    s.pop();                }                s.pop();            }            i++;        }        else {            t.flog=0;            while(!s.empty()&&s.top().op!='('&&mp[ch[i]]<=mp[s.top().op]) {                q.push(s.top());                s.pop();            }            t.op=ch[i++];            s.push(t);        }    }    while(!s.empty()) {        q.push(s.top());        s.pop();    }}double cal(){    double t1,t2;    while(!q.empty()) {        t=q.front();        q.pop();        if(t.flog==1)   s.push(t);        else {            t2=s.top().num;            s.pop();            t1=s.top().num;            s.pop();            sum.flog=1;            if(t.op=='-')                sum.num=t1-t2;            if(t.op=='+')                sum.num=t1+t2;            if(t.op=='*')                sum.num=t1*t2;            if(t.op=='/')                sum.num=t1/t2;            s.push(sum);        }    }    return s.top().num;}int main(){    mp['+']=mp['-']=1;    mp['*']=mp['/']=2;    while(gets(ch)) {        if(ch[0]=='0'&&strlen(ch)==1)            break;        while(!s.empty())            s.pop();        change();        printf("%.2lf\n",cal());    }}