• hiho169周


    题目链接

    计算表达式100*(2+12)-(20/3)*2

    --------------------------------------------------------------------------------------------------------

    主要思路是找最后计算的运算符

    括号里面的运算符肯定不是最后算的,所以要找括号外的,如果括号外有+-号肯定要选+-,没有则找*/,再没有说明整个表达式被括起来了。

    #include <set>
    #include <map>
    #include <stack>
    #include <queue>
    #include <cmath>
    #include <vector>
    #include <string>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    
    #define MAX(a,b) ((a)>=(b)?(a):(b))
    #define MIN(a,b) ((a)<=(b)?(a):(b))
    #define OO 0x0fffffff
    using namespace std;
    typedef long long LL;
    const int N = 128;
    char str[N];
    int cal(int s,int e){
         int number=0; bool isAnum=true;
         for(int i=s;i<e;i++){
             if(str[i]<'0'||str[i]>'9') {isAnum=false;break;}
             number=number*10+str[i]-'0';
         }
         if(isAnum) return number;
    
         int cnt=0;
         int lv1=-1,lv2=-1;
         for(int i=s;i<e;i++){
            switch(str[i]){
               case '(':cnt++; break;
               case ')':cnt--; break;
               case '+':case '-': if(!cnt) lv1=i;break;
               case '*':case '/': if(!cnt) lv2=i;break;
            }
         }
         if(lv1<0) lv1=lv2;
         if(lv1<0) return cal(s+1,e-1);
         switch (str[lv1]){
             case '+' : return cal(s,lv1) + cal(lv1+1,e);
             case '-' : return cal(s,lv1) - cal(lv1+1,e);
             case '*' : return cal(s,lv1) * cal(lv1+1,e);
             case '/' : return cal(s,lv1) / cal(lv1+1,e);
         }
    }
    int main(){
        scanf("%s",str);
        printf("%d
    ",cal(0,strlen(str)));
        return 0;
    }
  • 相关阅读:
    linux格式化新硬盘并挂载,设置开机自动挂载
    各大名企的笔试面试题
    web2.0 Color
    选调生面试题
    网站流量概要分析
    css下拉菜单演示
    子查询
    技巧
    CMM与软件生命周期
    学习方法之PHP
  • 原文地址:https://www.cnblogs.com/redips-l/p/7598774.html
Copyright © 2020-2023  润新知