题目描述

假设表达式定义为:
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.将后缀表达式求值。将后缀表达式入栈,遇到运算符则弹出栈顶两个数进行运算,遇到新定义运算','特殊考虑一下即可。

 #include <bits/stdc++.h>
using namespace std;
string s;
string houzhui[];
map<char, int>M;
int ret_num(string s)
{
int l = s.size(), sum = ;
for(int i = ; i < l; i++)
{
if(s[i] >= '' && s[i] <= '')
sum = sum*+s[i]-'';
else return -;
}
return sum;
}
int Bit(int n)
{
int sum = ;
while(n)
{
sum += n%;
n /= ;
}
return sum;
}
int main()
{
int n;
stringstream ss;
string s1;
cin>>n;
M['('] = , M[','] = , M['+'] = , M['*'] = ;
while(n--)
{
cin>>s;
stack<char>S;
int l = s.size(), c = , num = ;
for(int i = ; i < l; i++)
{
if(s[i] == 'S' || s[i] == 'm' || s[i] == 'a' || s[i] == 'x') continue;
if(s[i] >= '' && s[i] <= '') num = num*+s[i]-'';
else
{
if(num != )//两运算符相邻的情况
{
ss.clear();
ss<<num, ss>>s1;
houzhui[c++] = s1;
num = ;
} if(s[i] == '(') S.push(s[i]);
else if(s[i] == ')')
{
while(S.top() != '(')
{
houzhui[c++] = S.top();
S.pop();
}
S.pop();
}
else
{
while(!S.empty() && M[S.top()] >= M[s[i]])
{
houzhui[c++] = S.top();
S.pop();
}
S.push(s[i]);
}
}
}
ss.clear();
if(num != )
{
ss<<num, ss>>s1;
houzhui[c++] = s1;
}
while(!S.empty())
{
houzhui[c++] = S.top();
S.pop();
}
stack<int>S1;
for(int i = ; i < c; i++)
{
num = ret_num(houzhui[i]);//判断是否是整数若是返回其值,不是返回-1(数不可能为负)
if(num != -) S1.push(num);
else
{
int n2 = S1.top();
S1.pop();
int n1 = S1.top();
S1.pop();
if(houzhui[i] == "+") S1.push(n1+n2);
else if(houzhui[i] == "*") S1.push(n1*n2);
else
{
int bit1 = Bit(n1);
int bit2 = Bit(n2);
S1.push(max(bit1, bit2));
}
}
}
printf("%d\n", S1.top());
}
return ;
}

最新文章

  1. HTTP Cookie详解
  2. Newtonsoft.Json异常处理
  3. MongoDB-C#驱动帮助
  4. HTML表格边框的设置小技巧
  5. Microsoft Dynamics CRM MVP
  6. AngularJS 国际化——Angular-translate
  7. 平易近人、兼容并蓄——Spark SQL 1.3.0概览
  8. 挑战python
  9. Kafka 安装和测试
  10. Java基础:三步学会Java Socket编程
  11. Java Web开发之Servlet、JSP基础
  12. shell之rm -rf的别名设置
  13. WPF 设置WebBrowser控件不弹脚本错误提示框
  14. oracle----sqlldr用法(转)
  15. datatables里面的search怎么去掉?
  16. 【网络流问题&middot;我就想建好模】
  17. java判断字符串是否回文
  18. Java程序设计第一次作业
  19. SpringBoot配置devtools实现热部署
  20. 测试一体机ASM failgroup的相关问题处理

热门文章

  1. input 虚拟键盘
  2. iOS开发之JSONKit
  3. vux在ISO中异常 this.$vux.confirm.show
  4. POSIX 进程间通信 (可移植操作系统接口)
  5. Oracle中用sql语句取随机数和整数
  6. Django学习笔记之Queryset的高效使用
  7. CF1155D Beautiful Array(动态规划)
  8. SVN 的用法
  9. oracle中的异常处理方法
  10. CORE MVC 自定义认证