表达式建树

 //用数组实现树
1
#include<iostream> 2 #include<ctype.h> 3 #include<cstring> 4 #define N 10000 5 #define optd 1 6 #define optr 2 7 using namespace std; 8 int treeL[N], treeR[N]; 9 class node 10 { 11 public: 12 int flag;//区分当前节点是操作符还是操作数 13 double k; 14 char ch; 15 }; 16 17 node opt[N]; 18 int nodeN; 19 char formula[1000]; 20 21 int buildTree(int ld, int rd) 22 { 23 int i; 24 for(i=ld; i<rd; ++i) 25 if(!isdigit(formula[i])) 26 break; 27 if(i>=rd)//最后全部为数字的时候 28 { 29 ++nodeN; 30 opt[nodeN].flag=optd; 31 sscanf(formula+ld, "%lf", &opt[nodeN].k); 32 treeL[nodeN]=treeR[nodeN]=0;//末端节点没有左右孩子 33 return nodeN;//返回当前所建节点编号 34 } 35 int pAS=-1, pMD=-1;//分别表示加减号, 乘除号所在的位置 36 int paren=0;//记录左括弧相对于右括弧出现的数目 37 for(i=ld; i<rd; ++i) 38 { 39 switch(formula[i]) 40 { 41 case '(': ++paren; break; 42 case ')': --paren; break; 43 44 //最后计算的运算符一定是在括弧的外边,不会包含在括弧里边 45 case '+': 46 case '-': 47 if(paren==0) pAS=i; 48 break; 49 case '*': 50 case '/': 51 if(paren==0) pMD=i; 52 break; 53 } 54 } 55 if(pAS<0) pAS=pMD; 56 if(pAS<0) //说明没有找到括弧外边的运算符,则脱掉一对括弧重新寻找 57 return buildTree(ld+1, rd-1); 58 int u=++nodeN; 59 opt[u].flag=optr;//表示存储操作符 60 opt[u].ch=formula[pAS]; 61 treeL[u]=buildTree(ld, pAS); 62 treeR[u]=buildTree(pAS+1, rd); 63 return u; 64 } 65 66 void printTree(int cur)//中序输出表达式树 67 { 68 if(cur)//非末端节点 69 { 70 printTree(treeL[cur]); 71 if(opt[cur].flag==optd) 72 cout<<opt[cur].k<<" "; 73 else 74 cout<<opt[cur].ch<<" "; 75 printTree(treeR[cur]); 76 } 77 } 78 79 int main() 80 { 81 while(cin>>formula) 82 { 83 buildTree(0, strlen(formula)); 84 printTree(1); 85 } 86 return 0; 87 }
 //用链表实现树
1
#include<iostream> 2 #include<ctype.h> 3 #include<cstring> 4 #define N 10000 5 #define optd 1 6 #define optr 2 7 using namespace std; 8 9 class node 10 { 11 public: 12 node *lchild, *rchild; 13 int flag;//区分当前节点是操作符还是操作数 14 double k; 15 char ch; 16 }; 17 18 char formula[1000]; 19 20 void buildTree(node* &T, int ld, int rd) 21 { 22 int i; 23 for(i=ld; i<rd; ++i) 24 if(!isdigit(formula[i])) 25 break; 26 if(i>=rd)//最后全部为数字的时候 27 { 28 T=new node(); 29 T->flag=optd; 30 sscanf(formula+ld, "%lf", &T->k); 31 return ; 32 } 33 int pAS=-1, pMD=-1;//分别表示加减号, 乘除号所在的位置 34 int paren=0;//记录左括弧相对于右括弧出现的数目 35 for(i=ld; i<rd; ++i) 36 { 37 switch(formula[i]) 38 { 39 case '(': ++paren; break; 40 case ')': --paren; break; 41 42 //最后计算的运算符一定是在括弧的外边,不会包含在括弧里边 43 case '+': 44 case '-': 45 if(paren==0) pAS=i; 46 break; 47 case '*': 48 case '/': 49 if(paren==0) pMD=i; 50 break; 51 } 52 } 53 if(pAS<0) pAS=pMD; 54 if(pAS<0) //说明没有找到括弧外边的运算符,则脱掉一对括弧重新寻找 55 return buildTree(T, ld+1, rd-1); 56 T=new node(); 57 T->flag=optr;//表示存储操作符 58 T->ch=formula[pAS]; 59 buildTree(T->lchild, ld, pAS); 60 buildTree(T->rchild, pAS+1, rd); 61 } 62 63 void printTree(node *T)//中序输出表达式树 64 { 65 if(T)//非末端节点 66 { 67 printTree(T->lchild); 68 if(T->flag==optd) 69 cout<<T->k<<" "; 70 else 71 cout<<T->ch<<" "; 72 printTree(T->rchild); 73 } 74 } 75 76 int main() 77 { 78 while(cin>>formula) 79 { 80 node *T=NULL; 81 buildTree(T, 0, strlen(formula)); 82 printTree(T); 83 } 84 return 0; 85 }

 

 

转载于:https://www.cnblogs.com/hujunzheng/p/3786399.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python label标签的作用_label标签的作用是什么?

label标签的作用是为鼠标用户改进了可用性&#xff0c;当用户点击【】标签中的文本时&#xff0c;浏览器就会自动将焦点转到和该标签相关联的控件上。label标签的作用&#xff1a;一、标签定义及用法在html中&#xff0c;标签通常和标签一起使用&#xff0c;标签为input元素定义…

java异常自定义返回信息,Spring Boot 如何自定义返回错误码错误信息

说明在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息&#xff0c;而不是统一的而不是统一的下面这种格式返回到调用端INTERNAL_SERVER_ERROR(500, "Internal Server Error"),下面我们来看看如何将我们自定义的错误码和错误信息返回到调用端。1 自定…

文件管理系统_Python学习第170节--Linux文件管理系统实际操作和具体介绍

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】上节我们简单了解了Linux文件管理系统&#xff0c;现在我们学习它的实际操作。首先我们解释下~和/的区别。~之前我们介绍过&#xff0c;我们说~是Linux系统的根目录&#xff0c;其实这个说法是不准确的&#xf…

redis 计数器 java_Redis 的 8 大应用场景!

之前讲过Redis的介绍&#xff0c;及使用Redis带来的优势&#xff0c;这章整理了一下Redis的应用场景&#xff0c;也是非常重要的&#xff0c;学不学得好&#xff0c;能正常落地是关键。下面一一来分析下Redis的应用场景都有哪些。1、缓存缓存现在几乎是所有中大型网站都在用的必…

sql中in与php数组,格式化SQL“IN”子句的PHP数组

我正在尝试在数据库中查询“product_id”包含在产品ID数组中的记录.该数组是多选输入(< select>)的结果,如下所示&#xff1a;$clients Array ([0] > 80000016-1302638679[1] > 8000003B-1329924004)我想将该数组传递给sql语句的“IN”子句,例如&#xff1a;$sql …

汇编汉诺塔

1 .3862 .model flat3 .stack 40964 include io.h5 ExitProcess proto near32 stdcall, ExitCode:dword6 cr equ 0dh7 lf equ 0ah8 .data9 string1 byte "请输入汉诺塔数&#xff1a;", cr, lf 10 strNum byte 10 dup(?) 11 result byte 10 dup( ) 12 byte c…

oracle精度说明符1~38_Oracle 错误代码总结及解决方案

ORA-00001&#xff1a;违反唯一约束条件(主键错误)ORA-00028&#xff1a;无法连接数据库进程ORA-00900&#xff1a;无效sql语句ORA-00904&#xff1a;字段名写错或是建表时最后一个字段有逗号ORA-00907&#xff1a;缺少右括号ORA-00911&#xff1a;无效字符ORA-00917&#xff1…

opencv为matlab,OpenCV与matlab部分函数的对应关系(转)

2、matlab中的zeros函数相当于OpenCV中的cvSetZero函数。3、matlab中的两矩阵点乘 .*相当于OpenCV中的cvMul函数。4、matlab中的两矩阵点除 ./相当于OpenCV中的cvDiv函数。5、matlab中的两矩阵相加 相当于OpenCV中的cvAdd函数。6、matlab中的两矩阵相减 -相当于OpenCV中的cvSub…

预测分析算法的设计与实现_基于LD(编辑距离算法)的单词速记数据库分析设计与实现...

2020-21-1学期《最新数据库管理系统》结课作业展示。作者&#xff1a;牟伦利 褚四浩 陈思琴 曹鹏飞(电商11802)分工陈思琴&#xff1a;系统需求分析 、系统相关算法分析和ER图曹鹏飞&#xff1a;系统数据字典 、业务流程图、数据流程图和PPT制作牟伦利&#xff1a;存储过程、触…

参考文献要不要首行缩进_参考文献格式要求(2015-2016-2)

1参考文献统一使用下列格式一、参考文献构成参考文献分为两个部分&#xff1a;正文部分的夹注和文后参考文献处的参考文献条目。1.正文部分的夹注(作者的姓页码)正文引用了他人的观点后&#xff0c;在后面紧靠引用处给出夹注。例如&#xff1a;The contemporary text linguisti…

c++与java中子类中调用父类成员的方法

1 java中&#xff1a;2 import java.util.Scanner;3 public class ClassTest{4 public static void main(String args[]){5 child chnew child(2);6 parent pch;7 p.print();8 //p.print2();//调用错误&#xff0c;父类中没有改成员方法&#xff0c…

华为畅享max有没有人脸识别_华为畅享7s有人脸识别吗 让我来告诉你

现在大家使用手机的频率越来越频繁&#xff0c;手机也为我们提供了许多的便利&#xff0c;今天小编也来说一下这个华为畅享7s有人脸识别吗 让我来告诉你相关的文章&#xff0c;这个操作其实不复杂&#xff0c;接下来就给大家介绍一下华为畅享7s有人脸识别吗 让我来告诉你&#…

matlab knnsearchidx,matlab查找最临近搜索knnsearch

[Idx,D] knnsearch(___) additionally returns the matrix D, using any of the input arguments in the previous syntaxes. D contains the distances between each observation in Y and the corresponding closest observations in X.使用先前语法中的任何输入参数返回矩阵…

php导出excel数据代码,phpspreadsheet导出数据到Excel的方法介绍(代码示例)

本篇文章给大家带来的内容是关于phpspreadsheet导出数据到Excel的方法介绍(代码示例)&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。之前我们使用PHP导出Excel数据时使用的是PHPExcel库&#xff0c;但是phpoffice已经官方宣…

sp 导出unity哪个_GitHub上发现的一个导出Unity3D场景数据的工具

1、源地址2、导出脚本脚本名:Unity3DExporter.csC#using UnityEditor;using UnityEngine;using System;using System.Collections.Generic;using System.Linq;using System.IO;public class Unity3DExporter : EditorWindow{private static bool mIsWindowOpen;private bool mE…

poj3422 Kaka's Matrix Travels(最小费用最大流问题)

1 /*2 poj3422 Kakas Matrix Travels 3 不知道 k次 dp做为什么不对&#xff1f;&#xff1f;&#xff1f;4 看了大牛的代码&#xff0c;才知道还可以这样做&#xff01; 5 开始没有理解将a 和 a‘ 之间建立怎样的两条边&#xff0c;导致程序一直陷入死循环&#xff0c;真心花了…

java把对象转成图片格式转换器安卓版,java 万能图片格式转换

话不多说&#xff0c;直接上代码import java.awt.image.BufferedImage;import java.awt.image.Raster;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;public class IOUtil {public static void pgm2png(String src, String dest) throws IOExc…

hadooppythonsql_python - hadoop,mapreduce demo

Hadoop,mapreduce 介绍59888745qq.com大数据工程师是在Linux系统下搭建Hadoop生态系统(cloudera是最大的输出者类似于Linux的红帽)&#xff0c;把用户的交易或行为信息通过HDFS(分布式文件系统)等存储用户数据文件&#xff0c;然后通过Hbase(类似于NoSQL)等存储数据&#xff0c…

hdu 2896 病毒侵袭 ac自动机

1 /*2 hdu 2896 病毒侵袭 ac自动机 3 从题意得知&#xff0c;模式串中没有重复的串出现&#xff0c;所以结构体中可以将last[]&#xff08;后缀链接&#xff09;数组去掉 4 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 。本题中主要是计算每一个模式串5 在主串中有没…

axure原件 总是丢失_Axure实现提示文本单击显示后自动消失的效果

FORM一 .新增的input输入属性 1.email类型 在表单提交E-mail地址时,无效的输入会生成很多无效数据,对后期的数据检索造成一定的影响.所以在表单提交之前,需要对输入的E-mail地址进行有效 ...Google的Protobuf协议分析protobuf和thrift类似,也是一个序列化的协议实现,简称PB(下文…