PAT 1130 Infix Expression

news2024/11/24 20:57:20

个人学习记录,代码难免不尽人意。

Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with parentheses reflecting the precedences of the operators.

Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤ 20) which is the total number of nodes in the syntax tree. Then N lines follow, each gives the information of a node (the i-th line corresponds to the i-th node) in the format:

data left_child right_child
where data is a string of no more than 10 characters, left_child and right_child are the indices of this node’s left and right children, respectively. The nodes are indexed from 1 to N. The NULL link is represented by −1. The figures 1 and 2 correspond to the samples 1 and 2, respectively.

infix1.JPG
infix2.JPG

Figure 1 Figure 2
Output Specification:
For each case, print in a line the infix expression, with parentheses reflecting the precedences of the operators. Note that there must be no extra parentheses for the final expression, as is shown by the samples. There must be no space between any symbols.

Sample Input 1:

8
* 8 7
a -1 -1
* 4 1
+ 2 5
b -1 -1
d -1 -1
- -1 6
c -1 -1

Sample Output 1:

(a+b)*(c*(-d))

Sample Input 2:

8
2.35 -1 -1
* 6 1
- -1 4
% 7 8
+ 2 3
a -1 -1
str -1 -1
871 -1 -1

Sample Output 2:

(a*2.35)+(-(str%871))
#include<cstdio>
#include<iostream>
#include<set>
#include<algorithm>
#include<string>
using namespace std;
const int maxn=25;
struct node{
	string data;
	string op;
	int lchild;
	int  rchild;
	bool flag;
}Node[maxn]; 
bool hashtable[maxn];
void print(int root){//flag为true代表左节点 
    if(root==-1) return;
    if(!(Node[root].lchild==-1&&Node[root].rchild==-1)){
     cout << "(";
	}

    print(Node[root].lchild);
    if(Node[root].flag)
    cout << Node[root].data;
    else
    cout << Node[root].op;
    print(Node[root].rchild);
    if(!(Node[root].lchild==-1&&Node[root].rchild==-1)){
     cout << ")";
	}
   
   
}
int main(){
   int n;
   scanf("%d",&n);
   fill(hashtable+1,hashtable+1+n,false);
   for(int i=1;i<=n;i++){
   	      string a;
   	      int left,right;
   	      cin >> a;
   	      scanf("%d %d",&left,&right);
   	      if(left!=-1)
   	      hashtable[left]=true;
   	      if(right!=-1)
   	      hashtable[right]=true;
   	      if(a[0]=='+'||a[0]=='-'||a[0]=='*'||a[0]=='\\'||a[0]=='%'){
   	      	     Node[i].op=a;
   	      	     Node[i].flag=false;
   	      	     Node[i].lchild=left;
   	      	     Node[i].rchild=right;
			 }
		  else{
		  	     Node[i].data=a;
   	      	     Node[i].flag=true;
   	      	     Node[i].lchild=left;
   	      	     Node[i].rchild=right;
		  }
   }
   int root;
   for(int i=1;i<=n;i++){
   	if(!hashtable[i]){
   		root=i;
   		break;
	   }
    }
 
    print(Node[root].lchild);
    if(Node[root].flag)
    cout << Node[root].data;
    else
    cout << Node[root].op;
    print(Node[root].rchild);
    printf("\n");
}

这道题是中序遍历的变式应用,我的做法可能有些复杂了,有些人好像并没有考虑输入的符号,我判断了符号再存储起来,事实可能没有必要这样做。

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

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

相关文章

煤质软化:提升采矿效率的关键技术

煤质软化&#xff1a;提升采矿效率的关键技术 随着煤炭的广泛应用和能源需求的增长&#xff0c;对煤炭采矿和利用的要求也不断提高。传统的煤炭采矿方法往往面临一些困难和挑战&#xff0c;如厚层、高硬度以及强抗压性等问题&#xff0c;导致采掘效率低下、操作困难&#xff0c…

如何搭建接口自动化测试框架?

经过了一年多的接口测试工作&#xff0c;旧的框架也做了一些新的调整&#xff0c;删除了很多冗余的功能&#xff0c;只保留了最基本的接口结构验证、接口回归测试、线上定时巡检功能。 一、框架的演进 界面 UI 做了优化&#xff0c;整个框架的画风突然不一样了&#xff08;人…

1688API技术解析,实现按图搜索1688商品(拍立淘)

一种可能的解决方案是使用图像识别和相似度匹配的算法。您可以通过将输入的图片与1688上的商品图片进行比对&#xff0c;找出最相似的商品。这涉及到图像特征提取、相似度计算以及数据库匹配等技术。您可以使用开源的图像处理库&#xff08;如OpenCV&#xff09;来进行图像处理…

38. 连续签到领金币数

文章目录 题目需求思路一实现一题目来源 题目需求 用户每天签到可以领1金币&#xff0c;并可以累计签到天数&#xff0c;连续签到的第3、7天分别可以额外领2和6金币。 每连续签到7天重新累积签到天数。 从用户登录明细表中求出每个用户金币总数&#xff0c;并按照金币总数倒…

无涯教程-分类算法 - Python实现函数

为了在Python中实现SVM&#xff0c;无涯教程将从标准库导入开始&#xff0c;如下所示- import numpy as np import matplotlib.pyplot as plt from scipy import stats import seaborn as sns; sns.set() 接下来&#xff0c;从sklearn.dataset.sample_generator创建具有线性可…

材料空间「填空解谜」:MIT 利用深度学习解决无损检测难题

内容一览&#xff1a;材料检测在工程、科学及制造业中扮演着至关重要的角色。传统的材料检测方法&#xff0c;例如切割和化学试剂检测具有破坏性&#xff0c;同时较为耗费时间和资源。近期&#xff0c;MIT 科学家利用深度学习开发了一种技术&#xff0c;能够填补缺失信息&#…

迁移学习:实现快速训练和泛化的新方法

文章目录 迁移学习的原理迁移学习的应用快速训练泛化能力提升 迁移学习的代码示例拓展应用与挑战结论 &#x1f389;欢迎来到AIGC人工智能专栏~迁移学习&#xff1a;实现快速训练和泛化的新方法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博…

服务网格实施周期缩短 50%,丽迅物流基于阿里云 ACK 和 ASM 的云原生应用管理实践

作者&#xff1a;王夕宁、 刘强、 华相 公司介绍 丽迅物流是百丽旗下专注于时尚产业、为企业提供专业物流及供应链解决方案的服务商。其产品服务主要包括城市落地配、仓配一体、干线运输及定制化解决方案。通过自研智能化物流管理平台&#xff0c;全面助力企业合作集约化发展…

C++中前置++和后置++的详细讲解

参考链接&#xff08;链接讲的很全&#xff09;&#xff1a;C前置和后置的区别 对于迭代器和其他模板对象使用前缀形式 (i) 的自增, 自减运算符.&#xff0c;理由是 前置自增 (i) 通常要比后置自增 (i) 效率更高。 class Age { public: Age& operator() //前置 {…

c++ std::ref

ref 对于函数式编程&#xff08;如 std::bind&#xff09;&#xff0c;是对参数直接拷贝&#xff0c;而不是引用&#xff0c;std::ref的引入就是为了解决一些传参问题 ref是个函数模板&#xff0c;用来构建一个reference_wrapper对象并返回&#xff0c;该对象拥有传入的elem变…

day-33 代码随想录算法训练营(19) 贪心part03

1005.K次取反后最大化的数组和 思路一&#xff1a;求出正负数的个数&#xff0c;根据k值来进行取反 134.加油站 思路&#xff1a;考虑总油量和当前剩余油量&#xff0c;同时遍历两个数组&#xff0c;当前剩余油量小于0时&#xff0c;说明在 i 之前都无法出发。 135.分发糖果 …

yml基本语法与支持的数据格式

一、yml基本语法 1、yml文件以缩进代表层级关系 2、缩进不允许使用tab只能使用空格 3、空格的个数不重要&#xff0c;只要相同层级的元素左对齐即可 4、大小写敏感 5、数据格式为&#xff0c;名称:(空格)值 二、yml支持的数据格式 1、对象&#xff1a;键值对的集合(key:…

EDAS系统提交 | 编译报错显示 fonttype: Font DejaVuSans is of type Type 3.

目录 1. 问题&#xff1a;fonttype: Font DejaVuSans is of type Type 3. 2. 原因及解决&#xff1a;用python的matplotlib画的图片转出的pdf有问题&#xff0c;包含Type 3字体。 3. 具体解决过程&#xff1a;在用python代码画图时&#xff0c;添加一行代码&#xff0c;重新…

第八周第一天学习总结 | MySQL入门及练习学习第三天

实操练习 1.创建一个名为 lianxi 的数据库 2.在 lianxi 库内创建一个名为 xinxi 的数据表要求如下&#xff1a; 包含信息&#xff1a;编号&#xff0c;姓名&#xff0c;备注&#xff0c;籍贯&#xff0c;部门&#xff0c;公司。 3.给xinxi表添加相应信息&#xff1a; 4.查询…

kafka复习:(22)一个分区只能被消费者组中的一个消费者消费吗?

默认情况下&#xff0c;一个分区只能被消费者组中的一个消费者消费。但可以自定义PartitionAssignor来打破这个限制。 一、自定义PartitionAssignor. package com.cisdi.dsp.modules.metaAnalysis.rest.kafka2023;import org.apache.kafka.clients.consumer.internals.Abstrac…

【环境配置】Android-Studio-OpenCV-JNI以及常见错误 ( 持续更新 )

最近一个项目要编译深度学习的库&#xff0c;需要用到 opencv 和 JNI&#xff0c;本文档用于记录环境配置中遇到的常见错误以及解决方案 Invalid Gradle JDK configuration found failed Invalid Gradle JDK configuration foundInvalid Gradle JDK configuration found. Open…

【Acwing905】区间选点贪心策略超清晰证明!!包含题解

题目描述 贪心策略 首先按右端点对区间进行排序 然后从左到右遍历每一个区间&#xff0c;如果这个区间还没有选中的点&#xff0c;那么就选择这个区间的右端点&#xff0c;否则就pass掉这个区间 举一个栗子 贪心策略证明 假设最少的选点数为&#xff1a;ans 利用上述贪心策…

【JUC基础】JUC入门基础

目录 什么是JUC线程和进程锁传统的 synchronizedLock 锁Synchronized 与 Lock 的区别 生产者和消费者问题Synchronized 版Lock版Condition 的优势&#xff1a;精准通知和唤醒线程 8 锁现象问题1&#xff1a;两个同步方法&#xff0c;先执行发短信还是打电话&#xff1f;问题2&a…

代码随想录刷题笔记 (python版本) 持续更新.....

代码随想录刷题笔记总结: https://www.programmercarl.com/ 个人学习笔记 如有错误欢迎指正交流1. 数组 1.1 理论基础 详细介绍:https://www.programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 数组下标都是从0开始的。数组内存空间的地址是…

什么是亚马逊类目核心关键词?

亚马逊类目核心关键词是指在亚马逊平台上&#xff0c;与特定产品类别相关且具有较高搜索量和竞争度的关键词。这些关键词在产品标题、描述、属性和搜索关键字等位置使用&#xff0c;有助于提高产品的曝光度和搜索排名&#xff0c;并吸引潜在买家的注意。选择适当的核心关键词可…