当前位置: 首页 > news >正文

UVa 372 WhatFix Notation

题目描述

编译器和计算器中常用的三种遍历方法:

  • 中缀infix\texttt{infix}infix):如a + b + c
  • 前缀prefix\texttt{prefix}prefix):如+ a + b c
  • 后缀postfix\texttt{postfix}postfix):如a b c + +

前缀和后缀表示法的优点是不需要括号来避免歧义。

运算符优先级(从高到低):

  • ^(乘方)
  • */(乘除)
  • +-(加减)
  • &|(与、或)
  • !(非)

输入格式

输入包含两行字符串。第一行是中缀表达式,第二行是前缀表达式。所有输入字符由空格分隔。

输出格式

输出后缀表达式,同样以空格分隔。

样例输入

a + b - c + a - b c

样例输出

INFIX => a + b - c PREFIX => + a - b c POSTFIX => a b c - +

题目分析

问题的本质

这是一个表达式树重构问题。给定中缀表达式和前缀表达式,需要生成对应的后缀表达式。

中缀、前缀、后缀的关系

这三种表示法对应二叉树的不同遍历顺序:

  • 中缀:左子树→\to→\to右子树
  • 前缀:根→\to左子树→\to右子树
  • 后缀:左子树→\to右子树→\to

解题方法

利用前缀和中缀序列,可以唯一地重构表达式树,然后进行后序遍历得到后缀表达式。

算法步骤

  1. 前缀序列的第一个字符是树的根
  2. 在中缀序列中找到该根的位置root
  3. 中缀序列中根左边的部分是左子树的中缀序列,右边的部分是右子树的中缀序列
  4. 前缀序列中根之后的前root个字符是左子树的前缀序列,剩余是右子树的前缀序列
  5. 递归处理左右子树
  6. 后序输出(先左、后右、再根)

参考代码

// WhatFix Notation// UVa ID: 372// Verdict: Accepted// Submission Date: 2017-02-21// UVa Run Time: 0.000s//// 版权所有(C)2017,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;vector<char>sequences;// 存储后缀表达式字符// 根据前缀和中缀序列,递归生成后缀序列voidpostfix(string prefix,string infix){if(prefix.length()==0)return;// 找到根结点在中缀序列中的位置introot=0;for(;root<infix.length();root++)if(infix[root]==prefix.front())break;// 递归处理左子树// 左子树的中缀序列:infix[0..root-1]// 左子树的前缀序列:prefix[1..root]postfix(prefix.substr(1,root),infix.substr(0,root));// 递归处理右子树// 右子树的中缀序列:infix[root+1..end]// 右子树的前缀序列:prefix[root+1..end]postfix(prefix.substr(root+1),infix.substr(root+1));// 后序输出:先左、后右、再根sequences.push_back(prefix.front());}intmain(intargc,char*argv[]){string infix,prefix;while(getline(cin,infix),getline(cin,prefix)){cout<<"INFIX => "<<infix<<'\n';cout<<"PREFIX => "<<prefix<<'\n';// 去除空格for(inti=infix.size()-1;i>=0;i--)if(isblank(infix[i]))infix.erase(infix.begin()+i);for(inti=prefix.size()-1;i>=0;i--)if(isblank(prefix[i]))prefix.erase(prefix.begin()+i);sequences.clear();postfix(prefix,infix);cout<<"POSTFIX =>";for(inti=0;i<sequences.size();i++)cout<<' '<<sequences[i];cout<<'\n';}return0;}
http://www.zskr.cn/news/1454529.html

相关文章:

  • 在高通 Hexagon 上运行 BitNet:自定义 1.58 位内核实践
  • PUBG-Logitech:5步实现基于图像识别的罗技鼠标宏自动压枪系统
  • 2026/6/1
  • SVD图生视频API踩坑记:Fooocus生成的图片如何用OpenCV无损调整到1024x576分辨率?
  • 2026聊城市黄金回收白银回收铂金回收店铺哪家好 靠谱门店全区域top推荐及联系方式 - 余生黄金回收
  • 【Hadoop 10周年】我与Hadoop不得不说的故事
  • 罐体倒罐监测 磁翻板液位计十大品牌 设备液位定点监控 - 仪表人叶工
  • LabVIEW上位机+51单片机串口联动控制四相五线步进电机(含ULN2003驱动电路与完整工程文件)
  • 成都西装定制时尚指南:2024年5家潮流店铺深度测评 - 西装爱好者
  • KDiff3终极指南:如何快速掌握免费文件比较与合并工具
  • OpenIPC固件:为海思、君正等主流IP摄像头芯片提供完整开源解决方案
  • 粮食检测报告审核进入智能时代:AI报告审核助力IACheck实现效率翻倍与质量双提升
  • 告别环境冲突!在Win11的Anaconda里为Sionna和TensorFlow/PyTorch创建独立工作区
  • 树莓派DIY复古街机:从硬件选型到RetroPie系统配置全攻略
  • [开源] 电子健康档案访问透明时间线:面向患者知情权与信息科合规管理的审计可视化系统
  • R语言可视化进阶:如何用bayesplot和ggplot2定制出版级贝叶斯分析报告?
  • PostgreSQL 中 now() 函数事务内行为异常,clock_timestamp() 成解决方案
  • 通达信缠论插件终极指南:5分钟让复杂技术分析变简单
  • 绕过小米社区5级限制:一个Python脚本+替换系统App的BL解锁思路拆解
  • Arduino DS1307 RTC与OLED时钟项目:从I2C通信到时间显示全解析
  • 基于ESP8266与GPS模块的宠物追踪器:物联网全栈开发实践
  • ZYNQ-7020软硬协同电磁超声测厚方案:含伪随机编码激励、匹配滤波压缩与微伏级回波时延提取
  • 保姆级教程:在Proxmox VE 8上用OSX-PROXMOX脚本装macOS Monterey(附VNC远程避坑指南)
  • PHP文件上传处理完整指南
  • 【官方渠道变更公示】2026年6月南京建发璞云售楼处官方热线发布. - 速递信息
  • 磁轴键盘推荐!IQUNIX EV63实测 这键盘不入后悔
  • Python-sc2实战:教你写一个会运营的神族AI(自动造农民、水晶、兵营)
  • 2026咸阳各区金银铂金回收去哪靠谱?本地正规回收门店精选榜单+联系号码 - 余生黄金回收
  • RapidOCR:从毫秒级到微秒级的实时OCR推理优化技术架构
  • 从数据到地图:手把手教你用Arcgis完成人口统计与分级设色出图(附完整配置流程)