热门标签 | 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;
}

推荐阅读
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
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社区 版权所有