题目描述

给你一个不带括号的表达式,这个表达式只包含加、减、乘、除,请求出这个表 达式的最后结果,最后结果一定是整数;

输入

一个数学表达式,只包括数字,数字保证是非负整数,以及五种运算符 "+","-","*","/","=";数字和运算符之间有一个或者多个空格,运算符的总数 不会超过 100,最后以"="号结尾,表示表达式结束。注意:使用 C 的同学,在 读取字符串的时候请使用 scanf("%s",..);以免不必要的错误。

输出

整数;

样例输入

1 + 2 + 3 * 6 / 9 =

样例输出

5

来源

#include <bits/stdc++.h>
using namespace std;
char donser[100],temp[100];
int change(int num,int from)
{
    int i=from+1,x=0;
    x=temp[from]-'0';
    while(i-from<num)
    {
        x*=10;
        x+=temp[i]-'0';
        i++;
    }
    return x;
}
int main()
{
    memset(donser,0,sizeof(donser));
    memset(temp,0,sizeof(temp));
    while(gets(donser))
    {
        int i=0,j=0;
        while(donser[i]!='\0')
        {
            if(donser[i]!=' ')
                temp[j++]=donser[i];
            i++;
        }
        i=0;
        stack<int> num_stack;
        stack<char> fu_stack;
        while(temp[i]!='\0')
        {
            if(temp[i]>='0'&&temp[i]<='9')
            {
                int num=1,from=i;
                while(temp[i+1]>='0'&&temp[i+1]<='9')
                {
                    num++;
                    i++;
                }
                num_stack.push(change(num,from));
                i++;
            }
            if(!fu_stack.empty())
            {
                if(fu_stack.top()=='*'||fu_stack.top()=='/')
                {
                    int x=num_stack.top();
                    num_stack.pop();
                    int y=num_stack.top();
                    num_stack.pop();
                    if(fu_stack.top()=='*')
                        y=x*y;
                    else y=y/x;
                    num_stack.push(y);
                    fu_stack.pop();
                }
            }
            if(temp[i]=='+'||temp[i]=='-'||temp[i]=='*'||temp[i]=='/')
            {
                fu_stack.push(temp[i]);
                i++;
            }
            if(temp[i]=='=')
            {
                i++;
                continue;
            }
        }
        stack<int> num_stack_temp;
        stack<char> fu_stack_temp;
        while(!fu_stack.empty())
        {
            fu_stack_temp.push(fu_stack.top());
            fu_stack.pop();
        }
        while(!num_stack.empty())
        {
            num_stack_temp.push(num_stack.top());
            num_stack.pop();
        }
        while(!fu_stack_temp.empty())
        {
            int x=num_stack_temp.top();
            num_stack_temp.pop();
            int y=num_stack_temp.top();
            num_stack_temp.pop();
            if(fu_stack_temp.top()=='+')
                y=y+x;
            else
                y=x-y;
            num_stack_temp.push(y);
            fu_stack_temp.pop();
        }
        cout<<num_stack_temp.top()<<endl;
        num_stack_temp.pop();
        memset(donser,0,sizeof(donser));
        memset(temp,0,sizeof(temp));
    }
    return 0;
}

BUPT复试专题—科学计算器(2009)的更多相关文章

  1. BUPT复试专题—哈夫曼编码(2009)

    题目描述 哈夫曼编码中  平均码长=码长×码字出现的概率 如:ABCDE 五个字符的出现次数分别为50 20 5 10 15 那么,其哈夫曼编码为A:0   B:10   C:1110   D:111 ...

  2. BUPT复试专题—排序(2009)

    题目描述 查找序列a 中小于 b 的第 i 个数的数的个数 输入 输入有多组,每组四行第一行:序列a个数N第二行:(序列a的)N个数,升序排列第三行:序列b个数M 第四行:(序列b的)M个数,升序排列 ...

  3. BUPT复试专题—密码(2009)

    题目描述   输入 有多组输入,每组: 第一行:由26个小写字母组成的串以空格隔开,如 b a c e u f g h i j k l m n o p q r s t v w x y z d v y ...

  4. BUPT复试专题—寻找第 K 小的数(2009)

    题目描述 给你 n 个完全不相同整数(n<=300),每一个数都大于 0 并且小于 1000,请找出 第 k 小的数. 输入 输入包括两行,第一行用空格隔开的两个数 n 和 k;第二行有 n 个 ...

  5. BUPT复试专题—解析表达式(2015)

    题目描述 输入一个字符串形式的表达式,该表达式中包括整数,四则运算符(+.-.*./),括号,三角函数(sin(x).cos(x).tan(x)),底数函数(lg(x).ln(x)),计算该表达式的值 ...

  6. BUPT复试专题—字符串转换(2013计院)

    题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而"abcd"则不是简单串.现在给你一个仅由小写字母组成的字符串, ...

  7. BUPT复试专题—统计时间间隔(2013计院)

    题目描述 给出两个时间(24小时制),求第一个时间至少要经过多久才能到达第二个时间.给出的时间一定满足的形式,其中x和y分别代表小时和分钟.0≤x<24,0≤y<60. 输入格式 第一行为 ...

  8. BUPT复试专题—最值问题(2013计院)

    题目描述 给出N个数,求出这N个数中最大值和次大值.注意这里的次大值必须严格小于最大值.输入保证N个数中至少存在两个不同的数. 输入格式 第一行为测试数据的组数T(T≤20).请注意,任意两组测试数据 ...

  9. BUPT复试专题—数据库检索(2014软院)

    题目描述 在数据库的操作过程中,我们进场会遇到检索操作.这个题目的任务是完成一些特定格式的检索,并输出符合条件的数据库中的所有结果. 我们现在有一个数据库,维护了学生的姓名(Name),性别(Sex) ...

随机推荐

  1. MacBook Pro休眠掉电、耗电量大问题解决方案

    1.前言 最近我的2015mbpMacBook Pro (Retina, 13-inch, early 2015)更新完10.14系统后,发现休眠待机一晚上后能掉5%电,白天待机4-5小时又掉了8%. ...

  2. linux系统产生随机数的6种方法

    linux系统产生随机数的6种方法 方法一:通过系统环境变量($RANDOM)实现: [root@test ~]# echo $RANDOM 11595 [root@test ~]# echo $RA ...

  3. angular 列表渲染机制

    watchCollection:监听集合元素的变化,而不能监听到集合元素内部的属性变化,只要集合中元素的引用没有发生变化,则认为无变化.用这个api也可以监听普通对象的第一层属性变化. watch:监 ...

  4. 浮动的label

    在web项目中,有一个很重的模块就是登陆/注册模块,这个模块的主体部分就是一个form表单,这个form表单包含两个重要input组(用户名/密码),每个input组都包含label和input,而关 ...

  5. 条款40:明智而审慎地使用多重继承(use multiple inheritance judiciously)

    NOTE: 1.多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. 2.virtual 继承会增加大小 速度 初始化(及赋值)复杂度等等成本.如果virtual base ...

  6. $(addprefix PREFIX,NAMES…)

    addprefix 是makefile中的函数,是添加前缀的函数例如:$(addprefix src/,foo bar) 返回值为“src/foo src/bar”.所以上面的意思是为dirver_d ...

  7. PAT Basic 1050

    1050 螺旋矩阵 本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n 列,满足条件: ...

  8. PAT Basic 1030

    1030 完美数列 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数 ...

  9. saltstack管理八之常用执行模块

    所有执行模块: http://docs.saltstack.cn/zh_CN/latest/ref/states/all/index.html 常用模块:cmd, cron, file, mount, ...

  10. prometheus + mysqld_exporter + grafana 实现对mysql db的监控

    https://blog.csdn.net/hfut_wowo/article/details/78536022 1.参考这篇博文2.博主的用的是windows版本 prometheus-2.5.0- ...