表达式求值
时间限制:1000 ms | 内存限制:65535 KB
描述
假设表达式定义为: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
和另一题很相似,那个表达式求值是包含小数的,这个特殊在有一个函数要求,这个还比那个简单点
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stack>
#define maxx(a,b) a>b?a:b
using namespace std;
int main()
{
int T;
char s[1010];
scanf("%d",&T);
while(T--)
{
stack<char>s1;
stack<int>s2;
int i,j;
getchar();
scanf("%s",&s[1]);//从第二个空间开始读数
int len = strlen(&s[1]);//计算长度
s[0]='(';
s[len+1]=')';
len++;
for(i=0;i<=len;i++)
{
if(s[i]=='(')
{
s1.push(s[i]);//遇见左括号压入栈
}
else if(s[i]=='S')//进入函数
{
s1.push('(');
s1.push('S');
i+=4;//Smax
}
else if(s[i]>='0' && s[i]<='9')//字符转换成数字
{
int v=0;
while(s[i]>='0' &&s[i]<='9')
{
v=v*10+(s[i++]-'0');
}
i--;
s2.push(v);//压入栈
}
else if(s[i]=='+' ||s[i]=='-')
{
while(s1.top()!='(' && s1.top()!='S')
{
int a=s2.top();s2.pop();
int b=s2.top();s2.pop();
int c;
switch(s1.top())
{
case '+':c=b+a;break;
case '-':c=b-a;break;
case '*':c=b*a;break;
case '/':c=b/a;break;
}
s2.push(c);
s1.pop();
}
s1.push(s[i]);
}
else if(s[i]=='*' ||s[i]=='/')
{
if(s1.top()=='*')
{
int a=s2.top();s2.pop();
int b=s2.top();s2.pop();
s2.push(a*b);
s1.pop();
}
else if(s1.top()=='/')
{
int a=s2.top();s2.pop();
int b=s2.top();s2.pop();
s2.push(b/a);
s1.pop();
}
s1.push(s[i]);
}
else if(s[i]==')')
{
while(s1.top()!='(' && s1.top()!='S')
{
int a=s2.top();s2.pop();
int b=s2.top();s2.pop();
int c;
switch(s1.top())
{
case '+':c=b+a;break;
case '-':c=b-a;break;
case '*':c=a*b;break;
case '/':c=b/a;break;
}
s2.push(c);
s1.pop();
}
if(s1.top()=='S')
{
int a=s2.top();s2.pop();
int b=s2.top();s2.pop();
int c,da=0,db=0;
while(b!=0)
{
db=db+b%10;
b/=10;
}
while(a!=0)
{
da+=a%10;
a=a/10;
}
c=maxx(da,db);
s2.push(c);
s1.pop();
}
s1.pop();
}
}
printf("%d\n",s2.top());
}
return 0;
}