九度题目1019:简单计算器 2006年浙江大学计算机及软件工程研究生机试真题

// 九度27 简易计算器.cpp : 定义控制台应用程序的入口点。
//
#include<iostream>
#include<cstdio>
#include<stack>
#include<vector>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
char input[205];
map<char,int> changeSymbol;
map<int,char> Symbolchange;
void initSymbol()
{
    changeSymbol['+'] = -5;
    changeSymbol['-'] = -4;
    changeSymbol['*'] = -1;
    changeSymbol['/'] = -2;
}
int main( )
{
    int i,j;
    double n,s1,s2;
    initSymbol();
    while (gets(input)&&strcmp(input,"0")!=0)
    {
        vector<double> result;
        vector<char> symbol;
        for(i=0; i < strlen(input); i++)
        {
            if(' ' == input[i]) continue;
            if(changeSymbol.end() == changeSymbol.find(input[i]))//不是符号+-*/ 数字处理
            {
                j = i+1;
                n = input[i] - '0';
                while(input[j]!=' '&&input[j]!='\0')
                {
                    n *=10;
                    n +=input[j++] - '0';
                }
                i = j;
                result.push_back(n);
            }
            else//符号处理
            {
                    if(input[i] == '*')
                    {
                        double t = result.back();
                        i += 2;
                        j = i+1;
                        n = input[i] - '0';
                        while(input[j]!=' '&&input[j]!='\0')
                        {
                            n *=10;
                            n +=input[j++] - '0';
                        }
                        i = j;
                        result.pop_back();
                        result.push_back(t*n);
                    }
                    else if(input[i] == '/')
                    {
                        double t = result.back();
                        i += 2;
                        j = i+1;
                        n = input[i] - '0';
                        while(input[j]!=' '&&input[j]!='\0')
                        {
                            n *=10;
                            n +=input[j++] - '0';
                        }
                        i = j;
                        result.pop_back();
                        result.push_back(double(t)/double(n));
                    }
                    else
                    {
                        symbol.push_back(input[i]);
                    }
                }
            }//此时乘除法已经解决!!!接下来从正负号中做
            if(result.size() != 1)
            {
                vector<char>::iterator hr = symbol.begin();//要从头开始计算
                vector<double>::iterator cx = result.begin();//要从头开始计算
                while(hr != symbol.end())
                {
                    if((*hr) == '+')
                    {
                        s1 = *cx;
                        cx++;
                        s2 = *cx;
                        *cx = (s1+s2);
                    }
                    if((*hr) == '-')
                    {
                        s1 = *cx;
                        cx++;
                        s2 = *cx;
                        *cx = (s1-s2);
                    }
                    hr++;
                }
            }
            printf("%.2f\n",result.back());
        }
    return 0;
}
 
/**************************************************************
    Problem: 1019
    User: hrdjmax2
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1528 kb
****************************************************************/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值