hdu 简单计算器(栈)

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

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

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

Sample Input
   
1 + 2 4 + 2 * 5 - 7 / 11 0
 

Sample Output
   
3.00 13.36
ps:用两个栈,一个栈存字符,一个栈存数,当计算时,把数进栈,遇到*号或/号时,从数栈中弹出一个元素直接和下个数进行运算,并把运算结果压入数栈,当遇到+或者-时,要从符号栈中取出一个符号,并且从数栈中取出两个数按取出的符号进行运算,把运算结果存入数栈,并把+或者-压入符号栈。最后别忘了符号栈中可能不为空,要再计算一下。
代码:
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
int main()
{
    double a,b;
    char s[210],c;
    while(gets(s),strcmp(s,"0"))
    {
        stack<char>s1;//符号栈
        stack<double>s2;//数栈
        for(int i=0; s[i]!='0'; i++)
        {
            if(s[i]>='0'&&s[i]<='9')
            {
                a=0;
                while(s[i]>='0'&&s[i]<='9')
                {
                    a=a*10+s[i]-'0';
                    i++;
                }
                i--;//i要减一下1,虽然数字和符号中间有空格。可能是数据的问题,不减的话就错。。
                s2.push(a);
            }
            else if(s[i]=='*'||s[i]=='/')
            {
                c=s[i];
                a=s2.top();
                s2.pop();
                i+=2;
                b=0;
                while(s[i]<='9'&&s[i]>='0')
                {
                    b=b*10+s[i]-'0';
                    i++;
                }
                i--;
                if(c=='*')
                    a*=b;
                else
                    a/=b;
                s2.push(a);
            }
            else if(s[i]=='+'||s[i]=='-')
            {
                if(!s1.empty())
                {
                    c=s1.top();
                    s1.pop();
                    a=s2.top();
                    s2.pop();
                    b=s2.top();
                    s2.pop();
                    if(c=='+')
                        a+=b;
                    else
                        a=b-a;
                    s2.push(a);
                    s1.push(s[i]);
                }
                else
                    s1.push(s[i]);
            }
        }
        if(!s1.empty())//当s1中还有符号时
        {
            c=s1.top();
            s1.pop();
            a=s2.top();
            s2.pop();
            b=s2.top();
            s2.pop();
            if(c=='+')
                a+=b;
            else
                a=b-a;
            s2.push(a);
        }
        printf("%.2lf\n",s2.top());
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值