表达式求值
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述 假设表达式定义为: 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≤ T ≤ 10) 接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000 输出【标准输出】 对于每个表达式,输出一行,表示对应表达式的值。样例输入3
12+2*3
12*(2+3)
12*(2+3)+Smax(333,220+280)
样例输出18
60
69
来源河南省第九届省赛上传者onlinejudge
//把Smax的优先级设置为和’(‘一样大,同样的遇到’)’退出栈,其余的跟四则运算一样
四则运算https://blog.csdn.net/liwei_av/article/details/81393288
#include<iostream>
#include<stack>
#include<cstring>
#include<cstdio>
#include <ctype.h>
#include <stdlib.h>
#include<algorithm>
using namespace std;
int rank(char x)
{
int t;
if(x=='('||x=='S') t=0;
else if(x=='+'||x=='-') t=1;
else t=2;
return t;
}
bool compare(char a,char b)
{
int x=rank(a),y=rank(b);
if(x>y) return 1;
else return 0;
}
void compute(stack<int> &d,stack<char> &t)
{
int sum1=0,sum2=0;
int x=d.top();
d.pop();
int y=d.top();
d.pop();
switch(t.top())
{
case '+':d.push(y+x);break;
case '-':d.push(y-x);break;
case '*':d.push(y*x);break;
case '/':d.push(y/x);break;
case 'S':
while(x) sum1+=x%10,x/=10;
while(y) sum2+=y%10,y/=10;
d.push(max(sum1,sum2));break;
}
t.pop();
}
void arrange(char x,stack<int> &d,stack<char> &t)
{
if(t.empty()) t.push(x);
else
{
while(!t.empty()&&compare(x,t.top())==0) compute(d,t);
t.push(x);
}
}
int main()
{
int n;
cin>>n;
char s[1001];
stack<char> t;
stack<int> d;
while(n--)
{
cin>>s;
for(int i=0;i<strlen(s);i++)
{
if(isdigit(s[i]))
{
int n=atoi(&s[i]);
while(i<strlen(s)&&(isdigit(s[i]))) i++;
i--;
d.push(n);
}
else
{
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') arrange(s[i],d,t);
else if(s[i]=='(') t.push(s[i]);
else if(s[i]=='S') t.push(s[i]),i+=4;
else if(s[i]==')')
{
int flag=0;
while(t.top()!='(')
{
if(t.top()=='S') flag=1;
compute(d,t);
if(flag==1) break;
}
if(flag!=1) t.pop();
}
}
}
while(!t.empty()) compute(d,t);
if(d.size()==1) printf("%d\n",d.top());
d.pop();
}
}