【河南省第九届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 Output

18

60
69
HINT

Source

河南省第九届大学生程序设计竞赛

#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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【zzulioj 1837 LT说我不服 + dp】
下一篇:【codeforces 711B + 枚举】

发表评论

最新留言

感谢大佬
[***.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
apache php mysql架构图_Apache+PHP+MYSQL+Tomcat+JK架构设计技巧与应用实战 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
net mysql start3534_MySQL 5.7.14 net start mysql 服务无法启动-“NET HELPMSG 3534” 的奇怪问题... 2019-04-21
java socket udp 广播_1.Java 的屏幕广播(基于UDP),2.多线程下载器 2019-04-21
java控制热敏打印机的例子.rar_stm32控制热敏打印机 2019-04-21
java clone equals_(原)java中对象复制、==、equals 2019-04-21
php7 memcached.exe,PHP7 下安装 memcache 和 memcached 扩展 2019-04-21
计算机二级java技巧,计算机二级报java难考吗 2019-04-21
php foreach 数据库,php – 使用foreach将数据库检索的数据排列在HTML表中 2019-04-21
拉格朗日matlab编程例题,Matlab习题讲解.doc 2019-04-21
case是不是php语言关键字,PHP语言 switch 的一个注意点 2019-04-21
linux php mkdir失败,linux – mkdir错误:参数无效 2019-04-21