news 2026/6/3 15:52:09

UVa 372 WhatFix Notation

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 15:49:17

2026年AI编程工具全方位推荐:五大主流工具深度评测

在2026年Q2的开发者社区投票中&#xff0c;TRAE凭借98%的代码生成准确率&#xff08;CSDN评测数据&#xff09;和极高的性价比&#xff0c;成为增长最快的AI编程工具之一。截至2025年底&#xff0c;TRAE累计注册用户已突破600万&#xff0c;其中中文用户占比超过70%&#xff0c…

作者头像 李华
网站建设 2026/6/3 15:48:05

Alphabet计划募资800亿美元,全力押注AI基础设施建设

谷歌母公司Alphabet宣布&#xff0c;计划通过股权融资方式筹集最高800亿美元&#xff08;约合590亿英镑&#xff09;&#xff0c;用于支撑其大规模人工智能基础设施投资。此举规模之大&#xff0c;引发市场对AI经济效益的广泛质疑。此次融资是全球有史以来规模最大的股权募资之…

作者头像 李华
网站建设 2026/6/3 15:45:41

深度解析nCov2019_data_crawler开源数据工程:从Python爬虫源码剖析到公共卫生数据挖掘实战的自动化采集系统

深度解析nCov2019_data_crawler开源数据工程&#xff1a;从Python爬虫源码剖析到公共卫生数据挖掘实战的自动化采集系统 在2020年新冠疫情爆发初期&#xff0c;数据的时效性直接决定了防控决策的效率与科学模型的准确性。然而&#xff0c;面对海量的互联网信息&#xff0c;如何…

作者头像 李华
网站建设 2026/6/3 15:41:54

生命周期与不安全指针的零拷贝艺术:穿透 Tokio 运行时内核

生命周期与不安全指针的零拷贝艺术&#xff1a;穿透 Tokio 运行时内核 前言 大伙好&#xff0c;我是刘洋&#xff0c;网名第一程序员。虽然名头有点唬人&#xff0c;但我其实是个每天都在跟 Tokio 运行时和 Rust 生命周期标注斗智斗勇的系统编程萌新。最近在优化公司的 AI 推理…

作者头像 李华
网站建设 2026/6/3 15:40:44

入门吉他选购指南:桶型、材质、工艺对吉他性能的影响

作为吉他爱好者&#xff0c;我经常被问到入门吉他的选购问题。很多新手只关注品牌和价格&#xff0c;对吉他本身的物理特性缺乏了解。 今天从技术角度聊聊入门吉他的三个核心要素&#xff1a;桶型、材质、工艺。这些因素直接决定了吉他的音色特性、弹奏手感和使用寿命。一、桶型…

作者头像 李华