题目描述

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

输入

一个数学表达式,只包括数字,数字保证是非负整数,以及五种运算符 "+","-","*","/","=";数字和运算符之间有一个或者多个空格,运算符的总数 不会超过 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;
}

最新文章

  1. Python学习基础知识概要
  2. asp.net c# 网上搜集面试题目大全(附答案)
  3. hdu1000,hdu1001,hdu1002,hdu1003
  4. WCF服务配置编辑器使用
  5. 2013/11/22工作随笔-缓存是放在Model层还是放在Controller层
  6. Java 遍历Map时 删除元素
  7. Java BigInteger(大数,ACM比赛专用)
  8. 李洪强漫谈iOS开发[C语言-025]-赋值运算符案例
  9. textarea&#160;在浏览器中固定大小和禁止拖动
  10. Problem B: Ternarian Weights
  11. article标签和aside标签两者的理解
  12. YII2 小部件(widgets)
  13. JAVA Timer定时器使用方法(二)
  14. Vue按需加载提升用户体验
  15. JS事件响应的学习总结
  16. python采用 多进程/多线程/协程 写爬虫以及性能对比,牛逼的分分钟就将一个网站爬下来!
  17. Scrum And Teamwork
  18. 清理messages提示-bash: /var/log/messages: Operation not permitted的处理
  19. 新唐N32905U1DN开发教程:MDK环境下工程搭建(官方提供的固件库)(转)
  20. 从零开始学Kotlin-类和对象(5)

热门文章

  1. 纯 CSS 创作一个表达怀念童年心情的条纹彩虹心特效
  2. 【转发】【composer】composer 命令行介绍
  3. 前端Web框架的实现过程
  4. ajax以及文件上传的几种方式
  5. 模板&lt;最小生成树&gt;
  6. hdu2051
  7. HDU——2647Reward(DFS或差分约束)
  8. 浅谈中途相遇攻击--meet-in-the-middle attack
  9. 「CodePlus 2018 4 月赛」最短路
  10. nosql整理