zoukankan      html  css  js  c++  java
  • hdu1237

    简单计算器

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


    Problem Description
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
     
    Input
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
     
    Output
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
     
    Sample Input
    1 + 2
    4 + 2 * 5 - 7 / 11 0
     
    Sample Output
    3.00
    13.36
     
    Source
     
     
    #include "iostream"
    #include "stdio.h"
    #include "math.h"
    #include "vector"
    #include "stack"
    #include "queue"
    #include "memory.h"
    #include "algorithm"
    #include "string"
    using namespace std;
    
    char e[250],post[250];
    stack<char>Op;
    
    bool Isnum(char c)
    {
        if(c>='0'&&c<='9')
            return true;
        return false;
    }
    
    int OPMode(char c)
    {
        if(c=='+')      return 1;
        if(c=='-')      return 2;
        if(c=='*')      return 3;
        if(c=='/')      return 4;
        return -1;
    }
    
    void SplitExp(char* s)
    {
        int i,j=0;
        memset(post,'',sizeof(post));
        for(i=0;i<strlen(s);i++)
        {
            if(s[i]==' ')
                continue;
            post[j++]=' ';
            while(Isnum(s[i]))
                post[j++]=s[i++];
            int curop=OPMode(s[i]);
            if(curop!=-1)
            {
                if(curop<=2)
                    while(!Op.empty())
                    {
                        post[j++]=Op.top();
                        Op.pop();
                    }
                else
                {
                    while(!Op.empty()&&OPMode(Op.top())>2)
                    {
                        post[j++]=Op.top();
                        Op.pop();
                    }
                }
                Op.push(s[i])   ;
            }
        }
        while(!Op.empty())
        {
            post[j++]=Op.top();
            Op.pop();
        }
    }
    
    stack<double>Num;
    double Cal()
    {
        while(!Num.empty())
            Num.pop();
        int i=0,j;
        int len=strlen(post);
        while (i++<len)
        {
            if(post[i]==' ')
                continue;
            double cur=0;
            bool hasnum=false;
            while (Isnum(post[i]))
            {
                cur*=10;
                cur+=post[i++]-'0';
                hasnum=true;
            }
            if(hasnum)
                Num.push(cur);
            if(OPMode(post[i])!=-1)
            {
                double num1=Num.top();
                Num.pop();
                double num2=Num.top();
                Num.pop();
                switch(post[i])
                {
                case '+':       Num.push(num2+num1);break;
                case '-':       Num.push(num2-num1);break;
                case '*':       Num.push(num2*num1);break;
                case '/':       Num.push(num2/num1);break;
                }
            }
        }
        return Num.top();
    }
    
    int main()
    {
        while(gets(e))
        {
            if(strcmp(e,"0")==0)
                break;
            SplitExp(e);
            printf("%.2f
    ",Cal());
        }
    }
  • 相关阅读:
    再谈算法复杂度
    Android 升级ADT到22第三方Jar包导致的ClassNotFoundException和NoClassDefFoundError异常解决
    spring security 3.1 实现权限控制
    Mysql又一次整理笔记--woods备忘
    从头认识Spring-3.8 简单的AOP日志实现(注解版)-扩展添加检查订单功能,以便记录并检測输入的參数
    Knockout JS 演示样例
    gulp初探
    [android] 线性布局和布局的组合
    [android] 相对布局和单位简介
    [android] 短信发送器
  • 原文地址:https://www.cnblogs.com/lxm940130740/p/3330728.html
Copyright © 2011-2022 走看看