思路:套用原来的模板,然后稍加修改。 不懂得同学看这里:表达式求值。
我们相当于添加了两个运算符Smax和,我们只需要把他们的优先级添加到表里面。然后实现Smax函数即可。
#include<bits/stdc++.h>
using namespace std;
char Precede(char a, char b)
{
char op[9][9] =
{// + - * / ( ) # Smax ,
{'>', '>', '<', '<', '<', '>', '>', '<', '>'},// +
{'>', '>', '<', '<', '<', '>', '>', '<', '>'},// -
{'>', '>', '>', '>', '<', '>', '>', '<', '>'},// *
{'>', '>', '>', '>', '<', '>', '>', '<', '>'},// /
{'<', '<', '<', '<', '<', '=', '0', '<', '0'},// (
{'>', '>', '>', '>', '0', '>', '>', '0', '>'},// )
{'<', '<', '<', '<', '<', '0', '=', '<', '0'},// #
{'<', '<', '<', '<', '<', '=', '0', '<', '<'},// Smax
{'<', '<', '<', '<', '<', '>', '0', '<', '0'} // ,
};
int x, y;
switch(a)
{
case '+': x = 0;break;
case '-': x = 1;break;
case '*': x = 2;break;
case '/': x = 3;break;
case '(': x = 4;break;
case ')': x = 5;break;
case '#': x = 6;break;
case 'S': x = 7;break;
case ',': x = 8;break;
}
switch(b)
{
case '+': y = 0;break;
case '-': y = 1;break;
case '*': y = 2;break;
case '/': y = 3;break;
case '(': y = 4;break;
case ')': y = 5;break;
case '#': y = 6;break;
case 'S': y = 7;break;
case ',': y = 8;break;
}
return op[x][y];
}
int get_sum(int a)
{
int ans = 0;
while (a)
{
ans += a % 10;
a /= 10;
}
return ans;
}
int Smax(int a, int b)
{
return max(get_sum(a), get_sum(b));
}
int Calculation(int a,int b,char op)
{
switch(op)
{
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
case ',': return Smax(a, b);
}
}
int main()
{
//ios::sync_with_stdio(false);
int T; cin >> T;
while (T--)
{
string s;
cin >> s; s += '#';
stack<int> opnd; //数字栈
stack<char> optr;//符号栈
optr.push('#');
int num = 0, i = 0;
bool flag = false;
while (s[i] != '#' || optr.top() != '#')
{
if (isdigit(s[i]))
{
flag = true;
num = num * 10 + (s[i] - '0');
i++;
continue;
}
else
{
if (flag)
{
opnd.push(num); num = 0; flag = false;
}
switch(Precede(optr.top(),s[i]))
{
case '<':
optr.push(s[i]);
i++;
break;
case '=':
optr.pop();
i++;
break;
case '>':
char op = optr.top(); optr.pop();
int num1 = opnd.top(); opnd.pop();
int num2 = opnd.top(); opnd.pop();
int ans = Calculation(num2, num1, op);
opnd.push(ans); break;
}
}
if (s[i] == 'm') i += 4;
}
cout << opnd.top() << endl;
}
return 0;
}
/*
3
12+2*3
12*(2+3)
12*(2+3)+Smax(333,220+280)
*/