【zzuli-1923】表达式求值

题目描述

假设表达式定义为:
1. 一个十进制的正整数 X 是一个表达式。
2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+.
3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y 
值的各位数字之和,再从中选最大数。
4.如果 X 是 表达式,则 (X)也是表达式。
例如: 
表达式 12*(2+3)+Smax(333,220+280) 的值为 69。
请你编程,对给定的表达式,输出其值。

输入

第一行: T 表示要计算的表达式个数 ($1 le T le 10$)
接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000

输出

对于每个表达式,输出一行,表示对应表达式的值。

样例输入

3
12+2*3
12*(2+3)
12*(2+3)+Smax(333,220+280) 

样例输出

18
60
69

1.将中缀表达式转化成后缀表达式。如果是整数直接输出,如果是运算符且比栈顶元素优先极高就压入栈顶,否则弹出栈顶运算符。其中左括号优先级最低,但是遇到无条件压栈,遇到右括号就将栈内的运算符弹出,直到遇到左括号,左右括号不输出;新定义运算规则Smax可以看做运算符为','。

2.将后缀表达式求值。将后缀表达式入栈,遇到运算符则弹出栈顶两个数进行运算,遇到新定义运算','特殊考虑一下即可。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 string s;
  4 string houzhui[1004];
  5 map<char, int>M;
  6 int ret_num(string s)
  7 {
  8     int l = s.size(), sum = 0;
  9     for(int i = 0; i < l; i++)
 10     {
 11         if(s[i] >= '0' && s[i] <= '9')
 12             sum = sum*10+s[i]-'0';
 13         else return -1;
 14     }
 15     return sum;
 16 }
 17 int Bit(int n)
 18 {
 19     int sum = 0;
 20     while(n)
 21     {
 22         sum += n%10;
 23         n /= 10;
 24     }
 25     return sum;
 26 }
 27 int main()
 28 {
 29     int n;
 30     stringstream ss;
 31     string s1;
 32     cin>>n;
 33     M['('] = 0, M[','] = 1, M['+'] = 2, M['*'] = 3;
 34     while(n--)
 35     {
 36         cin>>s;
 37         stack<char>S;
 38         int l = s.size(), c = 0, num = 0;
 39         for(int i = 0; i < l; i++)
 40         {
 41             if(s[i] == 'S' || s[i] == 'm' || s[i] == 'a' || s[i] == 'x') continue;
 42             if(s[i] >= '0' && s[i] <= '9') num = num*10+s[i]-'0';
 43             else
 44             {
 45                 if(num != 0)//两运算符相邻的情况
 46                 {
 47                     ss.clear();
 48                     ss<<num, ss>>s1;
 49                     houzhui[c++] = s1;
 50                     num = 0;
 51                 }
 52  
 53                 if(s[i] == '(') S.push(s[i]);
 54                 else if(s[i] == ')')
 55                 {
 56                     while(S.top() != '(')
 57                     {
 58                         houzhui[c++] = S.top();
 59                         S.pop();
 60                     }
 61                     S.pop();
 62                 }
 63                 else
 64                 {
 65                     while(!S.empty() && M[S.top()] >= M[s[i]])
 66                     {
 67                         houzhui[c++] = S.top();
 68                         S.pop();
 69                     }
 70                     S.push(s[i]);
 71                 }
 72             }
 73         }
 74         ss.clear();
 75         if(num != 0)
 76         {
 77             ss<<num, ss>>s1;
 78             houzhui[c++] = s1;
 79         }
 80         while(!S.empty())
 81         {
 82             houzhui[c++] = S.top();
 83             S.pop();
 84         }
 85         stack<int>S1;
 86         for(int i = 0; i < c; i++)
 87         {
 88             num = ret_num(houzhui[i]);//判断是否是整数若是返回其值,不是返回-1(数不可能为负)
 89             if(num != -1) S1.push(num);
 90             else
 91             {
 92                 int n2 = S1.top();
 93                 S1.pop();
 94                 int n1 = S1.top();
 95                 S1.pop();
 96                 if(houzhui[i] == "+") S1.push(n1+n2);
 97                 else if(houzhui[i] == "*") S1.push(n1*n2);
 98                 else
 99                 {
100                     int bit1 = Bit(n1);
101                     int bit2 = Bit(n2);
102                     S1.push(max(bit1, bit2));
103                 }
104             }
105         }
106         printf("%d
", S1.top());
107     }
108     return 0;
109 }
原文地址:https://www.cnblogs.com/lesroad/p/8980099.html