当前位置: 首页 > 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.jsqmd.com/news/943080/

相关文章:

  • 2026年6月无锡跑网约车租车避坑指南:正规直营门店TOP3推荐 - 资讯速览
  • 运维避坑指南:用非root用户安装KingbaseES V8的正确姿势(附服务注册与开机自启)
  • 实验随笔|SQL 数据库安全权限实操
  • 如何用Rust+Vue技术栈构建高性能漫画下载器:哔咔漫画下载器深度解析
  • 在高通 Hexagon 上运行 BitNet:自定义 1.58 位内核实践
  • 2026年天津律师口碑榜,立足第三者返还财产/婚内过错取证/损害赔偿 - 速递信息
  • SVD图生视频API踩坑记:Fooocus生成的图片如何用OpenCV无损调整到1024x576分辨率?
  • PUBG-Logitech:5步实现基于图像识别的罗技鼠标宏自动压枪系统
  • 2026/6/1
  • 网安学习笔记一阶段02——Windows操作系统
  • 2026聊城市黄金回收白银回收铂金回收店铺哪家好 靠谱门店全区域top推荐及联系方式 - 余生黄金回收
  • Cesium 3D Tiles模型旋转老是不对?可能是坐标系没搞清(绕任意轴旋转实战)
  • 入门吉他选购指南:桶型、材质、工艺对吉他性能的影响
  • 从诊断仪到Python脚本:我是如何用udsoncan库快速搭建一个UDS诊断上位机的
  • 不只是NERDTree:彻底解决Vim终端图标乱码,你的字体可能从一开始就装错了
  • 【Hadoop 10周年】我与Hadoop不得不说的故事
  • 8086与8088单板机接口转换调试笔记(续)
  • 代码阅读方法与最佳实践
  • 罐体倒罐监测 磁翻板液位计十大品牌 设备液位定点监控 - 仪表人叶工
  • 成都西装定制时尚指南:2024年5家潮流店铺深度测评 - 西装爱好者
  • KDiff3终极指南:如何快速掌握免费文件比较与合并工具
  • 别再怕图片被压缩了!用MBRS+DNN给图片加个‘隐形锁’,实测抗JPEG压缩效果
  • LabVIEW上位机+51单片机串口联动控制四相五线步进电机(含ULN2003驱动电路与完整工程文件)
  • 如何使用 Web Worker 多线程计算重新架构现代化前端组件库与核心数据流
  • AI报告审核成检测机构新标配,IACheck助力果蔬检测报告一次合格率大幅提升
  • OpenIPC固件:为海思、君正等主流IP摄像头芯片提供完整开源解决方案
  • DeepONet非线性算子学习终极指南:从零基础到实战应用
  • UniApp插件实战:手把手教你将高德地图SDK封装成安卓原生插件(for HBuilderX 3.8.7)
  • MATLAB数字变频双脚本包:含DDC下变频与DUC上变频完整实现及可视化示例
  • OpenCode:166K 星的开源 AI 编程 Agent,一天涨 1000 星凭什么?