nyoj 1272 表达式求值--河南省第九届省赛A题
2016-06-11 21:11
573 查看
表达式求值
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
假设表达式定义为: 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
来源
河南省第九届省赛
上传者
onlinejudge
两个小时-.-终于模出来了-.-
省赛时爆零都是我的错
代码:
#include<cstdio> #include<stack> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char ch[1010]; int chang,i,a,b; char lp; int hao(); int sm(); int sh(); int sm() { int a,b; i+=4; a=hao(); // printf("guo\n"); b=hao(); int kkp=0,kkpp=0; // printf("%d %d\n",a,b); while (a) { kkp+=a%10; a/=10; } while (b) { kkpp+=b%10; b/=10; } a=max(kkp,kkpp); // printf("******* %d\n",a); return a; } int hao() { int a,b; stack<char> fu; stack<char> hfu; stack<int> shu; stack<int> hshu; i++;int kkp=0; for (;ch[i]!=')'&&ch[i]!=',';i++) { // printf("%d --%c-- 66\n",i,ch[i]); if (ch[i]=='S') shu.push(sm()); else if (ch[i]=='(') shu.push(hao()); else if (ch[i]>='0'&&ch[i]<='9') shu.push(sh()); else if (fu.empty()) fu.push(ch[i]); else { lp=fu.top(); fu.pop(); if (lp=='*'||lp=='/') { a=shu.top(); shu.pop(); b=shu.top(); shu.pop(); if (lp=='*') b*=a; else b/=a; shu.push(b); } else { fu.push(lp); } fu.push(ch[i]); } } if (!fu.empty()) { lp=fu.top(); fu.pop(); if (lp=='*'||lp=='/') { a=shu.top(); shu.pop(); b=shu.top(); shu.pop(); if (lp=='*') b*=a; else b/=a; shu.push(b); } else { fu.push(lp); } } while (!fu.empty()) { lp=fu.top(); fu.pop(); hfu.push(lp); } while (!shu.empty()) { a=shu.top(); shu.pop(); hshu.push(a); } while (!hfu.empty()) { lp=hfu.top(); hfu.pop(); a=hshu.top(); hshu.pop(); b=hshu.top(); hshu.pop(); if (lp=='+') a+=b; else a-=b; hshu.push(a); } //i++; a=hshu.top(); // printf("%d 000000\n",a); return a; } int sh() { int kkp=0; for (;ch[i]<='9'&&ch[i]>='0';i++) kkp=kkp*10+ch[i]-'0'; i--; return kkp; } int suan() { int a,b; stack<char> fu; stack<int> shu; stack<char> hfu; stack<int> hshu; chang=strlen(ch); for (i=0;i<chang;i++) { // printf("%d ==%c== 66\n",i,ch[i]); if (ch[i]=='S') shu.push(sm()); else if (ch[i]=='(') shu.push(hao()); else if (ch[i]>='0'&&ch[i]<='9') shu.push(sh()); else if (fu.empty()) fu.push(ch[i]); else { lp=fu.top(); fu.pop(); if (lp=='*'||lp=='/') { a=shu.top(); shu.pop(); b=shu.top(); shu.pop(); if (lp=='*') b*=a; else b/=a; shu.push(b); } else { fu.push(lp); } fu.push(ch[i]); } } if (!fu.empty()) { lp=fu.top(); fu.pop(); if (lp=='*'||lp=='/') { a=shu.top(); shu.pop(); b=shu.top(); shu.pop(); if (lp=='*') b*=a; else b/=a; shu.push(b); } else { fu.push(lp); } } while (!fu.empty()) { lp=fu.top(); fu.pop(); hfu.push(lp); } while (!shu.empty()) { a=shu.top(); shu.pop(); hshu.push(a); } while (!hfu.empty()) { lp=hfu.top(); hfu.pop(); a=hshu.top(); hshu.pop(); b=hshu.top(); hshu.pop(); if (lp=='+') a+=b; else a-=b; hshu.push(a); } a=hshu.top(); // printf("%d 000000\n",a); return a; } int main() { int t;scanf("%d",&t); while (t--) { scanf("%s",ch); int s=suan(); printf("%d\n",s); } return 0; }
相关文章推荐
- CUMT OJ 1012 漫长的旅程===走台阶问题
- 198. House Robber
- ShellExecute函数用法的实例代码
- Coroutine及其实现
- 静态链接库和动态链接库
- SharePoint服务器端对象模型 之 使用CAML进展数据查询
- C++中#if,#ifdef,ifndef
- SDI无缝转换器与普通SDI转换器的区别?
- Multiple actions were found that match the request
- 《JavaScript学习笔记》:只能输入数字的文本框
- Getting started with TypeScript and Sublime Text -- 摘自https://cmatskas.com/getting-started-with-typescript-and-sublime-text/
- JAVA——File类
- Root与Unlock Bootloader(解锁)
- poj 3678 Katu Puzzle 2-SAT
- bug:配置secondarynamenode && 斯塔尼亚聊天记录
- 直通矩阵,变频矩阵,无缝矩阵的区别是什么?
- vsftpd 本地用户无法上传文件解决方法
- HTML标签嵌套问题
- 两个月的php学习我学了些什么
- 在阿里云ubuntu14.04下安装配置lnmp环境