算术表达式的转换
2015-06-18 17:19
232 查看
算术表达式的转换
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\’#\’字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+ab-c/def
a*b+c-d/e*f
ab*cde/-f*+
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\’#\’字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+ab-c/def
a*b+c-d/e*f
ab*cde/-f*+
#include <map> #include <set> #include <cmath> #include <stack> #include <queue> #include <time.h> #include <cstdio> #include <cctype> #include <vector> #include <string> #include <climits> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define RR freopen("input.txt","r",stdin) #define WW freopen("output.txt","w",stdout) #define INF 0x3f3f3f3f using namespace std; char s[1110]; char str[1100]; char st[1100]; int trans(char c) { if(c=='+'||c=='-') return 1; if(c=='*'||c=='/') return 2; return 3; } void head() { int len=strlen(s); int top=0,i; int End=0; for(i=len-1;i;i--) { if(s[i]=='#') break; } for( i--; i>=0; i--) { if(s[i]>='a'&&s[i]<='z') { str[top++]=s[i]; } else if(s[i]!='(') { if(s[i]==')') { st[++End]=s[i]; } else { while(End&&st[End]!=')'&&trans(st[End])>trans(s[i]))//这里是大于 { str[top++]=st[End]; End--; } st[++End]=s[i]; } } else { while(st[End]!=')') { str[top++]=st[End]; End--; } End--; } } while(End) { str[top++]=st[End]; End--; } for(int i=top-1; i>=0; i--) { cout<<str[i]; } cout<<endl; } void mid() { for(int i=0; s[i]!='#'; i++) { if(s[i]!='('&&s[i]!=')') { cout<<s[i]; } } cout<<endl; } void last() { int top=0; int End=0; for(int i=0; s[i]!='#'; i++) { if(s[i]>='a'&&s[i]<='z') { str[top++]=s[i]; } else if(s[i]!=')') { if(s[i]=='(') { st[++End]=s[i]; } else { while(End&&st[End]!='('&&trans(st[End])>=trans(s[i]))//这里是大于等于 { str[top++]=st[End]; End--; } st[++End]=s[i]; } } else { while(st[End]!='(') { str[top++]=st[End]; End--; } End--; } } while(End) { str[top++]=st[End]; End--; } for(int i=0;i<top;i++) { cout<<str[i]; } cout<<endl; } int main() { scanf("%s",s); head(); mid(); last(); return 0; }
相关文章推荐
- 220 Contains Duplicate III
- MySQL或MariaDB忘记root密码
- 算术表达式的转换 分类: 栈和队列 2015-06-18 17:19 11人阅读 评论(0) 收藏
- 为最佳性能调优 Nginx
- hive大数据倾斜总结
- SAT阅读:高分备考资料60部
- 【弱省胡策】Round #6 String 解题报告
- Oracle 10g 安装ASM (RHEL5)
- remote: ERROR: missing Change-Id in commit message footer
- asp.net web应用程序不带后缀访问
- jsonp实现跨域问题
- 【弱省胡策】Round #6 String 解题报告
- 动态规划 0--1 背包问题
- css之文档流
- EHCache的使用
- Table的TR之间出现空格
- 数组划分
- function method(){}与var method = function(){}的区别
- iOS 模拟器小技巧
- Node.js学习--基础知识(9)--HTTP服务器