博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDUT2484算术表达式的转换
阅读量:4306 次
发布时间:2019-06-06

本文共 2601 字,大约阅读时间需要 8 分钟。

题目描述

小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
   因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。

输入

 输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)

输出

 输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。

示例输入

a*b+(c-d/e)*f#

示例输出

+*ab*-c/defa*b+c-d/e*fab*cde/-f*+ 这个题的话,看了白皮书上的那个建树,然后再写上前后中序遍历就可以了,其余的话,注意一下输入就可以,代码中两种输入都可以。
1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 const int maxn = 1000; 7 int lch[maxn],rch[maxn]; 8 char op[maxn]; 9 int nc=0; 10 int build_tree(char *s,int x,int y) 11 { 12 int i,c1=-1,c2=-1,p=0; 13 int u ; 14 if(y-x==1) 15 { 16 u=++nc; 17 lch[u]=rch[u] = 0; 18 op[u] = s[x] ; 19 return u; 20 } 21 22 for(i = x ; i < y ; i++) 23 { 24 switch(s[i]) 25 { 26 case '(': 27 p++; 28 break; 29 case ')': 30 p--; 31 break; 32 case '+': 33 case '-': 34 if(!p) c1=i; 35 break; 36 case '*': 37 case '/': 38 if(!p) c2=i; 39 break; 40 } 41 } 42 if(c1<0) c1 = c2 ; 43 if(c1 < 0) return build_tree(s,x+1,y-1); 44 u=++nc; 45 lch[u] = build_tree(s,x,c1); 46 rch[u] = build_tree(s,c1+1,y); 47 op[u] = s[c1]; 48 return u ; 49 } 50 void preorder(int u) 51 { 52 if(u) 53 { 54 printf("%c", op[u]); 55 preorder(lch[u]); 56 preorder(rch[u]); 57 } 58 } 59 60 void inorder(int u) 61 { 62 if(u) 63 { 64 inorder(lch[u]); 65 printf("%c", op[u]); 66 inorder(rch[u]); 67 } 68 } 69 70 void postorder(int u) 71 { 72 if(u) 73 { 74 postorder(lch[u]); 75 postorder(rch[u]); 76 printf("%c",op[u]); 77 } 78 } 79 int main() 80 { 81 char s[110]; 82 //int count ; 83 int i=0; 84 for(i = 0; ; i ++) 85 { 86 scanf("%c",&s[i]); 87 if(s[i]=='#') 88 break; 89 } 90 s[++i]='\0'; 91 /*scanf("%c",&s[i++]); 92 while(s[i-1]!='#') 93 { 94 scanf("%c",&s[i++]); 95 } 96 s[i]='\0';*/ 97 //scanf("%s",s); 98 int len = strlen(s); 99 int u = build_tree(s,0,len-1);100 preorder(u);101 printf("\n");102 inorder(u);103 printf("\n");104 postorder(u);105 printf("\n");106 return 0 ;107 }
View Code
 

 这个题还有很多别的做法,可以借鉴一下大神们的博客

这个的话贵在也简单在用了栈和队列,

 

 

转载于:https://www.cnblogs.com/luyingfeng/p/3226462.html

你可能感兴趣的文章
JDK1.8-Stream API使用
查看>>
cant connect to local MySQL server through socket /tmp/mysql.sock (2)
查看>>
vue中的状态管理 vuex store
查看>>
Maven之阿里云镜像仓库配置
查看>>
Maven:mirror和repository 区别
查看>>
微服务网关 Spring Cloud Gateway
查看>>
SpringCloud Feign的使用方式(一)
查看>>
SpringCloud Feign的使用方式(二)
查看>>
关于Vue-cli+ElementUI项目 打包时排除Vue和ElementUI
查看>>
Vue 路由懒加载根据根路由合并chunk块
查看>>
vue中 不更新视图 四种解决方法
查看>>
MySQL 查看执行计划
查看>>
OpenGL ES 3.0(四)图元、VBO、VAO
查看>>
OpenGL ES 3.0(五)纹理
查看>>
OpenGL ES 3.0(八)实现带水印的相机预览功能
查看>>
OpenGL ES 3.0(九)实现美颜相机功能
查看>>
FFmpeg 的介绍与使用
查看>>
Android 虚拟机简单介绍——ART、Dalvik、启动流程分析
查看>>
原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的协变、逆变
查看>>
FFmpeg 是如何实现多态的?
查看>>