hdu -1237- 简单计算器(栈实现)

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


简单计算器

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


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

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

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

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

Sample Output
      
      
3.00 13.36

解析:

字符串方式入栈,站定表示字符串尾,因此计算表达式时是从右向左计算的。

表达式的性质是从左向右,乘除优先,而加减左右无所谓了,因此需要单独处理乘除。

数据方面应注意:

0 + 0输出0.00而不是结束程序

1 / 2 / 2输出0.25

1 / 8 * 6输出0.75


参考代码:(该代码可优化----代码在main()中处理 加减时缀余,可在mul()中优化)

#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char str[210];
stack <char> s;
double num=0;

double mul()
{
    double p = s.top()-'0';
    s.pop();
    int t = 1;
    while(!(s.empty() || s.top()==' '))
    {
        t *= 10;
        p += (s.top()-'0')*t;
        s.pop();           
    } 
    if(!s.empty())   
        s.pop();
    if(s.empty() || s.top()=='+' || s.top()=='-')
        return p; 
    if(s.top() == '/')
    {
        s.pop();s.pop();
        return (double)mul()/p;           
    }
    else if(s.top() == '*')
    {
        s.pop();s.pop();
        return (double)mul()*p;           
    }        
}
int main()
{
    while(gets(str), strcmp(str, "0")!=0)
    {
       int len = strlen(str);
       for(int i=0; i<len; i++)
       {
           s.push(str[i]);        
       } 
       double p = s.top()-'0';
       s.pop();
       int t = 1;
       while(!(s.empty() || s.top()==' '))
       {
           t *= 10;
           p += (s.top()-'0')*t;
           s.pop();           
       } 
       if(!s.empty())   
           s.pop();
       int tmp;          
       while(!s.empty())
       {
            if(s.top() == '/')
            {
                s.pop();
                s.pop();
                p = mul()/p;
            }           
            else if(s.top() == '-')
            {
                s.pop();
                s.pop();
                tmp = s.top() - '0';
                s.pop();
                t = 1;
                while(!(s.empty() || s.top()==' ') )
                {
                    t *= 10;
                    tmp += (s.top()-'0')*t;
                    s.pop();           
                }    
                if(!s.empty())   
                    s.pop();
                num -= p;
                p = tmp; 
            }     
            else if(s.top() == '*')
            {
                s.pop();s.pop();
                p *= mul();
            }
            else if(s.top() == '+')
            {
                s.pop();s.pop();
                num += p;
                tmp = s.top() - '0';
                s.pop();
                t = 1;
                while(!(s.empty() || s.top()==' ') )
                {
                    t *= 10;
                    tmp += (s.top()-'0')*t;
                    s.pop();           
                }    
                if(!s.empty())   
                    s.pop();
                p = tmp;
            }
       }
       num += p;
       printf("%.2lf\n", num);
       num = 0;
    }
    return 0;    
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值