zoukankan      html  css  js  c++  java
  • 模拟:表达式求值

    交题应该是交过了,只不过网络赛的题没刷过去不知道什么原因

    这份板子总体来说还是很漂亮的

      1 #include<stack>
      2 #include<iostream>
      3 #include<cmath>
      4 #include<cstring>
      5 #include<cstdio>
      6 using namespace std;
      7 int cnt;
      8 char s[105];
      9 double transla(int &p)
     10 {
     11     double integer=0.0;    // 整数部分
     12     double remainder=0.0;  // 余数部分
     13     while(s[p]>='0'&&s[p]<='9')
     14     {
     15         integer*=10;
     16         integer+=(s[p]-'0');
     17         p++;
     18     }
     19     if(s[p]=='.')
     20     {
     21         p++;
     22         int c=1;
     23         while(s[p]>='0'&&s[p]<='9')
     24         {
     25             double t =s[p]-'0';
     26             t*=pow(0.1, c);
     27             c++;
     28             remainder+=t;
     29             p++;
     30         }
     31     }
     32     return integer+remainder;
     33 }
     34 int get_level(char ch)
     35 {
     36     switch(ch)
     37     {
     38         case '+':
     39         case '-':
     40             return 1;
     41         case '*':
     42         case '/':
     43             return 2;
     44         case '(':
     45             return 0;
     46         case '#':
     47             return -1;
     48     };
     49     return 0;
     50 }
     51 double opera(double a1,char op,double a2)
     52 {
     53     switch(op)
     54     {
     55         case '+':
     56             return a1+a2;
     57         case '-':
     58             return a1-a2;
     59         case '*':
     60             return a1*a2;
     61         case '/':
     62             return a1/a2;
     63     };
     64     return 0.0;
     65 }
     66 
     67 double calc()
     68 {
     69     stack<char> opsym;
     70     stack<double> opnum;
     71     opsym.push('#');
     72     int len=strlen(s);
     73     bool is_minus=1;
     74     for(cnt=0;cnt<len;)
     75     {
     76         if(s[cnt]=='-'&&is_minus)
     77         {
     78             opnum.push(0);
     79             opsym.push('-');
     80             cnt++;
     81         }
     82         else if(s[cnt]==')')
     83         {
     84             is_minus=0;
     85             cnt++;
     86             while(opsym.top()!='(')
     87             {
     88                 double a2=opnum.top();
     89                 opnum.pop();
     90                 double a1=opnum.top();
     91                 opnum.pop();
     92                 char op=opsym.top();
     93                 opsym.pop();
     94                 double res=opera(a1,op,a2);
     95                 opnum.push(res);
     96             }
     97             opsym.pop();
     98         }
     99         else if(s[cnt]>='0'&&s[cnt]<='9')
    100         {
    101             is_minus=0;
    102             opnum.push(transla(cnt));
    103         }
    104         else if(s[cnt]=='(')
    105         {
    106             is_minus=1;
    107             opsym.push(s[cnt]);
    108             cnt++;
    109         }
    110         else
    111         {
    112             while(get_level(s[cnt])<=get_level(opsym.top()))
    113             {
    114                 double a2=opnum.top();
    115                 opnum.pop();
    116                 double a1=opnum.top();
    117                 opnum.pop();
    118                 char op=opsym.top();
    119                 opsym.pop();
    120                 double res=opera(a1,op,a2);
    121                 opnum.push(res);
    122             }
    123             opsym.push(s[cnt]);
    124             cnt++;
    125         }
    126     }
    127     while(opsym.top()!='#')
    128     {
    129         double a2=opnum.top();
    130         opnum.pop();
    131         double a1=opnum.top();
    132         opnum.pop();
    133         char op=opsym.top();
    134         opsym.pop();
    135         double res=opera(a1,op,a2);
    136         opnum.push(res);
    137     }
    138     return opnum.top();
    139 }
    140 int main()
    141 {
    142     cin>>s;
    143     printf("%.3lf",calc());
    144     return 0;
    145 }
  • 相关阅读:
    Mac安装zookeeper
    征途
    vue-配置文件
    数组去重
    判断身份证
    判断邮箱
    判断手机号是否正确
    JS 时间格式转换
    打印 print-js
    自"愚"自乐的云服务器
  • 原文地址:https://www.cnblogs.com/aininot260/p/9627286.html
Copyright © 2011-2022 走看看