【河南省第九届ACM竞赛 A 题 && zzulioj 1923: 表达式求值 + 栈】
发布日期:2021-11-04 12:59:30
浏览次数:6
分类:技术文章
本文共 1987 字,大约阅读时间需要 6 分钟。
Description
假设表达式定义为:
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。 请你编程,对给定的表达式,输出其值。 Input第一行: T 表示要计算的表达式个数 (1≤ T ≤ 10)
接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000 Output对于每个表达式,输出一行,表示对应表达式的值。
Sample Input
3
12+2*3 12*(2+3) 12*(2+3)+Smax(333,220+280) Sample Output18
60 69 HINTSource
河南省第九届大学生程序设计竞赛
#include#include #include #include using namespace std;stack sta;// 储存数据stack st;//储存字符char pa[1011];int main(){ int T,i,pl; scanf("%d",&T); while(T--) { scanf("%s",&pa[1]); pl = strlen(&pa[1]); pa[0] = '('; pa[++pl] = ')';//在表达式两端添加一对小括号 for(i = 0; i <= pl; i++) { if(pa[i] == '(') st.push(pa[i]); else if(pa[i] == 'S') { st.push('('); i += 3; } else if(pa[i] >= '0' && pa[i] <= '9') { int vl=0; while(pa[i] >= '0' && pa[i] <= '9') vl = vl * 10 + (pa[i++] - '0'); i--; sta.push(vl); } else if(pa[i] == '+') { while(st.top() != '(' && st.top() != ',') { int a = sta.top(); sta.pop(); int b = sta.top(); sta.pop(); int ans; switch(st.top()) { case '+' : ans = a + b;break; case '*' : ans = a * b;break; } sta.push(ans); st.pop(); } st.push(pa[i]); } else if(pa[i] == '*') { if(st.top() == '*') { int a = sta.top(); sta.pop(); int b = sta.top(); sta.pop(); sta.push(a * b); st.pop(); } st.push(pa[i]); } else if(pa[i] == ')' || pa[i] == ',')//遇到逗号及时求值 { //当与道逗号时及时求出,Smax前半部分表达式的值 while(st.top() != '(') { int a = sta.top(); sta.pop(); int b = sta.top(); sta.pop(); int ans,ans1 = 0, ans2 = 0; switch(st.top()) { case '+' : ans = a + b;break; case '*' : ans = a * b;break; case ',' : { while(a) { ans1 += a % 10; a /= 10; } while(b) { ans2 += b % 10; b /= 10; } ans = max(ans1,ans2); break; } } sta.push(ans); st.pop(); } st.pop(); if(pa[i] == ',') //求完值以后,把逗号压入栈内,以便求出Smax后半部分表达式的值 st.push(pa[i]); } } printf("%d\n",sta.top()); sta.pop(); } return 0;}
转载地址:https://blog.csdn.net/WYK1823376647/article/details/52505022 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年03月15日 10时28分24秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python格式化字符串总结_Python字符串处理方法总结
2019-04-21
python中true什么意思_python中的bool是什么意思
2019-04-21
jacobian 矩阵意义_Jacobian矩阵和Hessian矩阵的作用是什么?
2019-04-21
c++ jna 数据类型_JNA 使用总结
2019-04-21
python中如何遍历列表并将列表值赋予_python中如何实现遍历整个列表?
2019-04-21
mysql redis缓存层_redis实现缓存的两种方式
2019-04-21
mysql索引篇_MySQL索引篇
2019-04-21
有至少一个用MySQL_Mysql有用的面试题
2019-04-21
mysql删除后数据库没变化_mysql之delete删除记录后数据库大小不变
2019-04-21
java控制热敏打印机的例子.rar_stm32控制热敏打印机
2019-04-21
java clone equals_(原)java中对象复制、==、equals
2019-04-21
计算机二级java技巧,计算机二级报java难考吗
2019-04-21
拉格朗日matlab编程例题,Matlab习题讲解.doc
2019-04-21
case是不是php语言关键字,PHP语言 switch 的一个注意点
2019-04-21
linux php mkdir失败,linux – mkdir错误:参数无效
2019-04-21