当前位置: 代码迷 >> 编程 >> hdu - 1237 - 容易计算器
  详细解决方案

hdu - 1237 - 容易计算器

热度:4697   发布时间:2013-02-26 00:00:00.0
hdu - 1237 - 简单计算器

题意:输入一个算术表达式,求值(数字为整数,但结果不一定是整数,不存在不合法的输入)。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237

——>>这是中缀表达式的运算。开两个栈,一个用来存操作数,一个用来存运算符。定义3个级别,# 的级别最低,+ 和 - 的级别相同且高于 #,* 和 / 的级别相同且高于 + 和 - ,先往运算符栈放入一个 # ,表达式最后也加一个 #,读表达式,若读到数字,则以数字类型输入,直接放入操作数栈,若读到的是运算符,则比较读到的运算符与运算符栈顶符号的级别,若比栈顶的高,则入栈,否则,从数栈取两个操作数进行运算符栈顶元素的运算,再把结果压入数栈,刚刚读到的运算符再与现在运算符栈顶元素的级别进行比较……最后数剩下的一个元素,就是结果。

#include <iostream>#include <cstdio>#include <stack>#include <cstring>using namespace std;int r(char c)       //级别{    switch(c)    {        case '#': return 0;        case '+': return 1;        case '-': return 1;        case '*': return 2;        case '/': return 2;        default: return -1;    }}double cal(double a, double b, char c)      //运算{    switch(c)    {        case '+': return a+b;        case '-': return a-b;        case '*': return a*b;        case '/': return a/b;        default: return -1;    }}int main(){    char s[210];    int i;    while(cin.getline(s, sizeof(s)))    {        if(strcmp(s, "0") == 0) return 0;        int len = strlen(s);        s[len++] = ' ';        s[len++] = '#';        s[len] = 0;        stack<char> f;        stack<double> dit;        f.push('#');        for(i = 0; i < len; i++)        {            if(s[i] == ' ') continue;            if(isdigit(s[i]))       //是数字            {                double temp;                sscanf(s+i, "%lf", &temp);      //以数字类型输入,开始没注意到两位及两位以上的整数,WA了1次!                dit.push(temp);                while(isdigit(s[i+1])) i++;            }            else        //是符号            {                bool ok = 1;                while(ok)                {                    if(r(s[i]) > r(f.top()))                    {                        f.push(s[i]);                        ok = 0;                    }                    else                    {                        if(s[i] == '#' && f.top() == '#') break;        //结束                        double b = dit.top(); dit.pop();                        double a = dit.top(); dit.pop();                        char c = f.top(); f.pop();                        double d = cal(a, b, c);                        dit.push(d);                    }                }            }        }        double ret = dit.top();        printf("%.2lf\n", ret);        while(!f.empty()) f.pop();        while(!dit.empty()) dit.pop();    }    return 0;}



1楼CharlesSwz前天 09:11
Good