后缀表达式转中缀表达式
来源:互联网 发布:爱情信风 网络歌手 编辑:程序博客网 时间:2024/06/06 00:41
这个专题很迷,因为这种东西很少使用,一般都是中缀转后缀(容易计算),但是有一些bt的题目总是喜欢这样倒着出题,所以适当的了解还是有必要的。
题目描述给出按后缀表示法输入的一个算术表达式,表达式中只有26个大写英文字母和加减乘除四个运算符号,表达式的长度<=50,表达式以#号结束。请你编程求出它的等价中缀表达式。输入输出格式输入格式:输入文件只有一行,就是后缀表达式。输出格式:输出文件只有一行,就是它的等价中缀表达式。输入输出样例输入样例#1:AB+CD*EF-*/ #输出样例#1:(A+B)/(C*D*(E-F))
这道题目可以使用一个字符串栈,每一步都添加一个括号,最后再判断情况能否删除括号,然后还要做一些小小的调整,就可以
#include<bits/stdc++.h>using namespace std;char s[5010][5010],c[5010];char first[5010],second[5010];int len[5010];int zhan1[5010],zhan2[5010];int cmp1(char a,char b){//a为插入的字符,b为比较//如果可以去括号,返回0 if(a=='/') if(b=='-' || b=='+')return 1; else return 0; if(a=='*') if(b=='+' || b=='-')return 1; else return 0; if(a=='+')return 0; if(a=='-')return 0;}int cmp2(char a,char b){//a为插入的字符,b为比较//如果可以去括号,返回0 if(a=='/')return 1; if(a=='*') if(b=='+' || b=='-')return 1; else return 0; if(a=='+')return 0; if(a=='-')return 0;}int xiao(char a,char b){//如果a比b小,返回0 if(a=='+')return 0; if(a=='-')return 0; if(b=='+' || b=='-')return 1; return 0;}int number;int pd1(char ch,char a[],int lena){ char small=41; for(int i=1;i<lena;i++){ if(a[i]=='('){ int zuo=1; while(a[i]!=')' || zuo){ i++; if(a[i]=='(')zuo++; if(a[i]==')')zuo--; } } if(i==lena)break; if((a[i]=='+' || a[i]=='-' || a[i]=='*' || a[i]=='/') &&(small==')' || xiao(a[i],small)==0)) small=a[i]; }// puts(a);printf("%c\n",small); if(small==')')return 1; return cmp1(ch,small);}int pd2(char ch,char a[],int lena){ char small=41; for(int i=1;i<lena;i++){ if(a[i]=='('){ int zuo=1; while(a[i]!=')' || zuo){ i++; if(a[i]=='(')zuo++; if(a[i]==')')zuo--; } } if(i==lena)break; if((a[i]=='+' || a[i]=='-' || a[i]=='*' || a[i]=='/') &&(small==')' || xiao(a[i],small)==0)) small=a[i]; } if(small==')')return 1; return cmp2(ch,small);}int main(){ int i,j,k,n,m,tmp=0; char ch=getchar(); while(ch!='#'){ if(ch>='A' && ch<='Z'){ s[++tmp][0]=ch; len[tmp]=1; } else if(ch=='+' || ch=='-' || ch=='*' || ch=='/'){ int lennow=1,now=tmp-1; strcpy(first,s[tmp-1]); s[now][0]='('; strcpy(second,s[tmp]); if(pd1(ch,first,len[tmp-1])==1){ //不去括号 lennow+=len[tmp-1]+1; for(i=1;i<lennow;i++) s[now][i]=first[i-1]; } else{ //去括号! lennow=lennow+len[now]-1; for(i=1;i<len[now]-2;i++) s[now][i]=first[i]; } s[now][lennow-1]=ch;///!!! int last=lennow; if(pd2(ch,second,len[tmp])==1){ lennow+=len[tmp]+1; for(i=last;i<lennow;i++) s[now][i]=second[i-last]; } else{ for(i=last;i<last+len[tmp]-1;i++) s[now][i]=second[i-last+1]; lennow=last+len[tmp]-1; } tmp--; len[tmp]=lennow; s[tmp][lennow-1]=')'; } ch=getchar(); } if(s[1][len[1]-1]==')') for(i=1;i<len[1]-1;i++) printf("%c",s[1][i]); else for(i=1;i<len[1];i++) printf("%c",s[1][i]); return 0;}
阅读全文
0 1
- 中缀转后缀表达式
- 表达式中缀转后缀
- 中缀转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 后缀表达式转中缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- tomcat中实现非项目图片的url访问
- 通过Navicat向MySQL导入Excel文件格式数据的方法及遇到的问题
- 尼姆博弈
- 关于如何深度手动管理activity
- ajax实现跨域请求
- 后缀表达式转中缀表达式
- html基础内容样式
- 移动web开发五之商品内容主体盒子
- Linux作业进程任务管理
- notepad++编java显示不出中文,编码GBK的不可映射字符
- 数据泵导入导出语句
- js实现五种排序
- PHP嵌套HTML写法
- 百度地图开发android studio获取sha1