算术表达式的转换
来源:互联网 发布:怎样安装电脑软件 编辑:程序博客网 时间:2024/04/29 20:34
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。 因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
a*b+(c-d/e)*f#
示例输出
+*ab*-c/defa*b+c-d/e*fab*cde/-f*+
+*ab*-c/defa*b+c-d/e*fab*cde/-f*+
#include <stdio.h>#include <algorithm>#include <stdlib.h>#include <string.h>#include <stack>using namespace std;char a[150];int len,cnt;void solve(char *n,int f) //标记变量f来记录是求前缀式还是后缀式;前缀式与后缀式有一点不同:对于前缀式,栈顶的符号优先级要大于即将要放入栈的符号的优先级,然后输出栈顶符号‘*’或‘/’,然后再将当前符号放入栈内;而对于后缀式,栈顶的符号优先级要大于等于当前符号的优先级,然后将栈顶符号‘*’或‘/’或‘+’或‘-’输出,然后再讲当前符号放入栈内。{ memset(a,0,sizeof(a)); stack<char>sl; cnt=0; for(int i=0; i<len; i++) { if(n[i]<='z'&&n[i]>='a') a[cnt++]=n[i]; else if(n[i]=='(') sl.push(n[i]); else if(n[i]==')') { while(sl.top()!='('&&!sl.empty()) { a[cnt++]=sl.top(); sl.pop(); } sl.pop(); } else if(n[i]=='+'||n[i]=='-') { if(f) { while(!sl.empty()&&sl.top()!='('&&(sl.top()=='*'||sl.top()=='/')) { a[cnt++]=sl.top(); sl.pop(); } } else while(!sl.empty()&&sl.top()!='(') { a[cnt++]=sl.top(); sl.pop(); } sl.push(n[i]); } else if(n[i]=='*'||n[i]=='/') { while(!sl.empty()&&sl.top()!='('&&(sl.top()=='*'||sl.top()=='/')) { a[cnt++]=sl.top(); sl.pop(); } sl.push(n[i]); } } while(!sl.empty()) { a[cnt++]=sl.top(); sl.pop(); }}int main(){ char st[150],sa[150]; memset(st,0,sizeof(st)); //清除原字符串 memset(a,0,sizeof(a)); //清除经转换后的字符串 memset(sa,0,sizeof(sa)); //清除倒置的字符串,用以转换前缀式 while(~scanf("%s",st)) { len=strlen(st)-1; //把字符“#”去掉 int i,j; for(i=0,j=len-1; i<len; i++,j--) { if(st[j]=='(') sa[i]=')'; else if(st[j]==')') sa[i]='('; else sa[i]=st[j]; } solve(sa,1); //得到前缀式 for(i=cnt-1; i>=0; i--) printf("%c",a[i]); printf("\n"); for(i=0; i<len; i++) //对于中缀式记得把括号去掉 { if(st[i]!='('&&st[i]!=')') printf("%c",st[i]); } printf("\n"); solve(st,0); //得到后缀式 for(i=0; i<cnt; i++) printf("%c",a[i]); printf("\n"); } return 0;}
0 0
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- [tableView reloadData]方法添加动画的方法
- Spring -- Bean自动装配&Bean之间关系&Bean的作用域
- SQL Cursor 基本用法
- 常调用的webService接口
- 【移动开发】布局优化利器<include/>和ViewStub
- 算术表达式的转换
- 黑马程序员---注解与反射的调用以及添加各种属性
- 这几年见识太少
- Junit 4 参数化
- 理解一般指针和指向指针的指针
- Inno Setup入门(十五)——Inno Setup类参考(1)
- poj 3083 Children of the Candy Corn dfs+bfs
- 104 Maximum Depth of Binary Tree
- AVA基础之反射(上)