热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

表达式转换——中缀表达式转换为后缀表达式

表达式转换算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后

表达式转换

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。

输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

知识点:将中缀表达式转化为后缀表达式:
两种情况:
(1)没有括号的中缀表达式转化为后缀表达式:

没有括号的中缀表达式转化为后缀表达式
(2)带有括号的中缀表达式转化为后缀表达式:

带有括号的中缀表达式转化为后缀表达式
分析:本题是带有括号的中缀表达式,需要利用第二种方式实现,模拟过程我会在代码上详解
这里说一下这道题的细节问题:
中缀表达式转换为后缀表达式:对于本题而言,细节过多,在完成表达式转换的基础上
1.需要控制空格,首尾不能出现空格
2.需要判断一位以上的数字之间不能有空格
3.需要判断小数的情况,注意之间不能有空格
4.需要判断镶嵌括号的情况,容易出现格式错误
例如:当一开始就输入多个空格会使首位出现空格
5.需要判断正负号
(1)对于正号,当出现在第一位时需直接特判(在第一位无需加括号)
未在第一位出现正号一定会在括号内,而且输出时正号要省略
(2)对于负号,当出现在第一位时需要直接特判(在第一位出现无需加括号)
未在第一位出现负号一定会在括号内,需要输出负号
(3)注意控制好空格,防止格式错误

下面是代码:


#include
#include
#include
#include
#include
using namespace std;
const int M=1010;
char str[M],st[M],c;
stack<char> q;
int main()
{int i,j,k&#61;0,l,m,n,f&#61;0,t&#61;0,ff&#61;0;cin.getline(str,110);l&#61;strlen(str);for(i&#61;0; i<l; i&#43;&#43;){if(str[i]>&#61;&#39;0&#39;&&str[i]<&#61;&#39;9&#39;)///为数字时输出{t&#61;1;///标记已经出现过数字///解决当有镶嵌括号时的格式问题if(ff&#61;&#61;0)///特判当刚开始有镶嵌括号时防止f&#61;1对格式的影响{printf("%c",str[i]);ff&#61;1;f&#61;0;continue;}///解决超过一位数的问题if(f&#61;&#61;0)///遇到数字并且前一个也是数字或&#39;.&#39;输出printf("%c",str[i]);else ///f&#61;1时遇到数字加空格输出&#xff0c;并使f&#61;0{printf(" %c",str[i]);f&#61;0;}}///解决小数问题else if(str[i]&#61;&#61;&#39;.&#39;)///遇到点说明为小数直接输出{printf("%c",str[i]);}///解决第一位为正数带&#39;&#43;&#39;的问题else if(i&#61;&#61;0&&str[i]&#61;&#61;&#39;&#43;&#39;){printf("%c",str[i]);}///解决第一位为正数带&#39;-&#39;的问题else if(i&#61;&#61;0&&str[i]&#61;&#61;&#39;-&#39;){printf("%c",str[i]);}///解决非第一位为正数带&#39;-&#39;的问题else if(str[i]&#61;&#61;&#39;(&#39;&&str[i&#43;1]&#61;&#61;&#39;-&#39;){///输出符号if(t&#61;&#61;1)///若已经出现数字&#xff0c;加符号时需在前面加空格printf(" %c",str[i&#43;1]);elseprintf("%c",str[i&#43;1]);q.push(str[i]);///将括号入栈f&#61;0;///输出数字无需加空格i&#43;&#43;;///跳过这个&#39;-&#39;}///解决非第一位为正数带&#39;&#43;&#39;的问题else if(str[i]&#61;&#61;&#39;(&#39;&&str[i&#43;1]&#61;&#61;&#39;&#43;&#39;){///带正号的数字的正号可以约去q.push(str[i]);///将括号入栈f&#61;1;///输入数字时需要加空格i&#43;&#43;;///跳过&#39;&#43;&#39;}///当遇见左括号else if(str[i]&#61;&#61;&#39;(&#39;){q.push(str[i]);///放入栈中f&#61;1;}///遇见右括号else if(str[i]&#61;&#61;&#39;)&#39;){///输出左括号到右括号之间的符号while(q.top()!&#61;&#39;(&#39;){printf(" %c",q.top());f&#61;1;///当输入数字时需加空格q.pop();///将输出的字符出栈}//printf("%c\n",q.top());q.pop();///将左括号出栈}else{///当栈为空或者栈顶元素为左括号if(q.size()&#61;&#61;0||q.top()&#61;&#61;&#39;(&#39;){f&#61;1;///输入数字时需要加空格q.push(str[i]);///将符号放入栈中}///当需要入栈的符号优先级大于栈顶符号优先级else if((str[i]&#61;&#61;&#39;*&#39;||str[i]&#61;&#61;&#39;/&#39;)&&(q.top()&#61;&#61;&#39;&#43;&#39;||q.top()&#61;&#61;&#39;-&#39;)){f&#61;1;///输入数字时需加括号q.push(str[i]);///将符号入栈}///入栈的符号优先级小于或等于栈顶符号优先级///栈中元素不为空且栈顶元素不是左括号else{///当栈顶元素为&#39;*&#39;或&#39;/&#39;if(q.top()&#61;&#61;&#39;*&#39;||q.top()&#61;&#61;&#39;/&#39;){f&#61;1;///输入数字需加空格printf(" %c",q.top());///加空格输出栈顶元素q.pop();///将栈顶元素出栈///出栈完看栈中元素是否为空///此时四种情况///&#xff08;1&#xff09;栈中元素为0///&#xff08;2&#xff09;栈顶元素为&#39;(&#39;///&#xff08;3&#xff09;栈底元素为&#39;&#43;&#39;或&#39;-&#39;&#xff0c;输入符号为&#39;*&#39;或&#39;/&#39;///&#xff08;4&#xff09;栈底元素为&#39;&#43;&#39;或&#39;-&#39;&#xff0c;输入符号为&#39;&#43;&#39;或&#39;-&#39;///情况一和情况二if(q.size()&#61;&#61;0||q.top()&#61;&#61;&#39;(&#39;){f&#61;1;///输出数字时需加空格q.push(str[i]);///将符号放入栈中}///情况三else if(str[i]&#61;&#61;&#39;*&#39;||str[i]&#61;&#61;&#39;/&#39;){f&#61;1;///输出数字时需加空格q.push(str[i]);///直接将符号入栈}///情况四else if(str[i]&#61;&#61;&#39;&#43;&#39;||str[i]&#61;&#61;&#39;-&#39;){f&#61;1;///输出数字时需加空格printf(" %c",q.top());///将栈顶元素加空格输出q.pop();///栈顶元素出栈q.push(str[i]);///将符号放入栈中}}///当栈顶元素为&#39;&#43;&#39;或&#39;-&#39;else if(q.top()&#61;&#61;&#39;&#43;&#39;||q.top()&#61;&#61;&#39;-&#39;){///两种情况///&#xff08;1&#xff09;入栈符号为&#39;*&#39;或&#39;/&#39;///&#xff08;2&#xff09;入栈符号为&#39;&#43;&#39;或&#39;-&#39;///情况一if(str[i]&#61;&#61;&#39;*&#39;||str[i]&#61;&#61;&#39;/&#39;){f&#61;1;///输出数字时需加空格q.push(str[i]);///将符号放入栈中}else if(str[i]&#61;&#61;&#39;&#43;&#39;||str[i]&#61;&#61;&#39;-&#39;){f&#61;1;///输出数字时需加空格printf(" %c",q.top());///输出栈顶元素q.pop();///栈顶元素出栈q.push(str[i]);///将符号放入栈中}}}}}///当栈中符号未完全出栈while(q.size()!&#61;0){printf(" %c",q.top());///将栈中符号依次输出q.pop();///依次出栈}printf("\n");return 0;
}

推荐阅读
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • 本文介绍了Linux系统中的文件IO操作,包括文件描述符、基本文件操作函数以及目录操作。详细解释了各个函数的参数和返回值,并提供了代码示例。 ... [详细]
  • 问题描述:通过添加最少数量的括号,使得给定的括号序列变为合法,并输出最终的合法序列。数据范围:字符串长度不超过100。涉及算法:区间动态规划(Interval DP)。 ... [详细]
  • 本文详细介绍了C++中map容器的多种删除和交换操作,包括clear、erase、swap、extract和merge方法,并提供了完整的代码示例。 ... [详细]
  • 本文介绍如何在 C++ 中使用链表结构存储和管理数据。通过具体示例,展示了静态链表的基本操作,包括节点的创建、链接及遍历。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • 深入解析for与foreach遍历集合时的性能差异
    本文将详细探讨for循环和foreach(迭代器)在遍历集合时的性能差异,并通过实际代码示例和源码分析,帮助读者理解这两种遍历方式的不同之处。文章内容丰富且专业,旨在为编程爱好者提供有价值的参考。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
author-avatar
阳光下微醺的我
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有