题目描述:

假设表达式定义为: 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

这道题和基本的表达式求值最主要的区别在于多了一个smax运算,其实也非常简单,只需要在运算时将smax中的逗号作为smax函数的运算符,并在自己编写的运算函数mathnum中加入此运算即可

解题代码;

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
using namespace std;
int smax(int x,int y){//判断smax,并返回较大的数 int m1=0,m2=0;while(x>0){m1+=x%10;x/=10;}while(y>0){m2+=y%10;y/=10;}if(m2>m1)return m2;return m1;
}
double mathnum(double x,double y,char ss){ //此函数用来运算当前步骤,根据不同的符号返回不同的结果if(ss=='+')return x+y;if(ss=='-')return y-x;if(ss=='*')return x*y;if(ss=='/')return y/x;if(ss==',')return smax(x,y);
}
int bj[6][6]{  //因为在ASC码表中 *+,-/分别为74 75 76 77 79  所以对应优先表建为这样 bj[i][j]中i代表字符栈顶端的字符,j代表当前字符,若其值为1则代表应将栈顶字符优先使用 {1,1,1,1,0,1},{0,1,1,1,0,0},{0,0,0,0,0,0},{0,1,1,1,0,0},{0,0,0,0,0,0},  //第四行以及第四列因为78对应的字符于运算无关,所以全部设为零 {1,1,1,1,0,1}
};
int main()
{int t;cin>>t;while(t--){stack<char> sl;  //符号栈 stack<double> nnum;   //数字栈 int num1=0;char sstr[1005];cin>>sstr;for(int i=0;i<strlen(sstr);i++){if(sstr[i]>='0'&&sstr[i]<='9')num1=num1*10+(sstr[i]-'0');  //若一直是数字,则一直乘 else{if(sstr[i-1]>='0'&&sstr[i-1]<='9')nnum.push(num1); //若此位不是数字且上一位是,则将num1加入到数字栈nnum中 num1=0;if(sstr[i]=='S')i+=4;    //如果此位等于S,说明就是smax函数,但是此题我准备使用中间的逗号,来表示smax函数, if(sstr[i]=='('||sl.empty()||sl.top()=='('){  //这三种特殊的情况直接将字符加入到字符栈 sl.push(sstr[i]);continue;}else if(sstr[i]==')'){  //如果是右括号,则 一直将其运算到左括号 double num2=nnum.top();nnum.pop();while(sl.top()!='(') {num2=mathnum(num2,nnum.top(),sl.top());sl.pop();nnum.pop();  }nnum.push(num2);sl.pop();continue;}int p1=sl.top()-'*',p2=sstr[i]-'*';  //若并非以上特殊情况则说明此位符号和符号栈栈顶符号均不是括号,则根据优先级判定如何计算 if(!bj[p1][p2])sl.push(sstr[i]);   //若此位优先级高,则直接将此位符号加入到符号栈 else {while(bj[p1][p2]){     //若不是则直接一直运算到栈顶符号优先级高于此位为止 double num2=nnum.top();nnum.pop();num2=mathnum(num2,nnum.top(),sl.top());nnum.pop(); nnum.push(num2);sl.pop();if(sl.empty()||sl.top()=='(')break;  //这个地方一定特别注意,因为可能此时将栈顶元素清除后,符号栈已经为空了 else p1=sl.top()-'*';}sl.push(sstr[i]);}}}if(sstr[strlen(sstr)-1]>='0'&&sstr[strlen(sstr)-1]<='9'){ //因为上面我们等到此位不为数字时才将前面的数字加入数字栈,但有可能算数表达式最后一个是数字,这样的话,按照上面的程序就还有最后一个数没有加入到数字栈中 nnum.push(num1);}while(!sl.empty()){double num2=nnum.top();nnum.pop();num2=mathnum(num2,nnum.top(),sl.top());nnum.pop();sl.pop();nnum.push(num2);}cout<<nnum.top()<<endl;}return 0;
} 

第九届河南省程序设计大赛 A 表达式求值相关推荐

  1. 第九届河南省程序设计大赛 D 导弹发射

    第九届河南省程序设计大赛 D 导弹发射 内存限制:64MB 时间限制:1s Special Judge: No 题目描述: Alpha 机构研发出一种新型智能导弹,它能够在雷达检测到的区域内,选择一条 ...

  2. 【ACM省赛】第九届河南省程序设计大赛 B 宣传墙

    题目链接:http://nyoj.top/web/contest/problem/cid/13/num/B 题目: 用1*2的地砖,填满4*N的墙,有多少种方案. 题解: 状压dp,枚举每个状态的可能 ...

  3. NYOJ - [第九届河南省程序设计大赛]宣传墙(DP)

    题目链接:http://nyoj.top/problem/1273 内存限制:64MB 时间限制:1000ms 题目描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准 ...

  4. 第九届河南省程序设计大赛 1273-宣传墙(java)

    1273-宣传墙 内存限制:64MB  时间限制:1000ms  Special Judge: No accepted:6  submit:12 题目描述: ALPHA 小镇风景美丽,道路整齐,干净, ...

  5. NYOJ - [第九届河南省程序设计大赛]Decimal integer conversion(暴力)

    题目链接:http://nyoj.top/problem/1277 内存限制:64MB 时间限制:1000ms 特判: No 题目描述 XiaoMing likes mathematics, and ...

  6. 第七届河南省程序设计大赛——A 海岛争霸

    第七届河南省程序设计大赛 A 海岛争霸 内存限制:64MB 时间限制:1s Special Judge: No 题目描述: 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海 ...

  7. 第七届河南省程序设计大赛~~海岛争霸(nyoj 1248)

    海岛争霸 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己的的 ...

  8. nyoj1249 物资调度 (第七届河南省程序设计大赛)

    物资调度 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 2 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方 ...

  9. 第七届河南省程序设计大赛——B 物资调度

    B 物资调度 题目描述: 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方,70%以上的路面损坏,桥梁全部被毁.国家立即启动应急预案,展开史上 ...

最新文章

  1. python线程暂停恢复退出_python中的暂停和恢复线程
  2. MFC中混合使用Duilib制作界面
  3. python matplotlib_Python の Matplotlib
  4. 如何在海量数据中查询一个值是否存在?
  5. Leaflet工作笔记-多个标签在地图显示不关闭
  6. 具有多个生成器和多个判别器的GAN
  7. 在线的代码托管平台 coding.net ===中国扩展版github
  8. RFIC4463_F2C
  9. hdu4883-模拟---区间计数小技巧
  10. 由古书看,古人应该知道地球是圆的
  11. win10隐藏桌面功能
  12. 前端之JavaScript入门篇
  13. 浙江大学计算机学院的软件工程和软件学院的软件工程哪个好,关于举办计算机技术和软件工程硕士复习班的通知-硕士招生-浙江大学计算机科学与技术学院中文站...
  14. 【Python】官方文档中文版
  15. wps怎么添加附录_如何将附录生成目录 - 卡饭网
  16. 【软件测试工程师】App 应用测试方法以及测试思路
  17. Excel VBA Sheet1和Sheets(1)的区别
  18. Linux命令行github,Linux命令行下使用GitHub
  19. 围棋的分数计算机,围棋比赛积分规则
  20. 【离散数学】阿贝尔群和循环群编程题

热门文章

  1. 【数据分析】数据分析达人赛1:用户情感可视化分析
  2. 【生物医学信号处理】生物医学信号处理教学软件DigiScope的matlab简单模拟实现
  3. Flutter有局限,拥抱Swift!优酷Mac迁移Swift实践
  4. 我的大学,追忆高三(永不能忘的332)
  5. 数字孪生赋能农业与农村的背景
  6. Fluent UDF【7】:解释型UDF
  7. 一篇大部分公务员的写照,总有人觉得好,也有人过的很郁闷。
  8. 读心云大师的写的宽心感悟
  9. 给爸妈春节最好的礼物 - 幸福手机(ThimFone)
  10. linux 识别 ntfs分区,Linux识别ntfs及分区挂载的四种方式