7-20 表达式转换 (25 分)(代码详解+题目分析)

一:题目

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

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

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

输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +

二:思路和坑

首先这道题要用到 栈吧 ,然后 就是一个设置运算符的优先级 用到了map ,再者 就是 这个题的例子 贼狗 要考虑 正负号的问题(正号省略不写 但负号 就一定要考虑进去) 其他 一些的优先级 我在次罗列出来

中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
注意:如果是在括号 中 遇到 (符号优先级的问题时 输出停止条件 中 有 栈顶 不等于 ’(‘)

三:上码(上马 让我们骑马游荡天涯)

/*
中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
*/#include<bits/stdc++.h>
using namespace std;int main(){stack<char>s;map<char,int>m;//设置符号间的优先级m['+'] = 1; m['-'] = 1;m['*'] = 2; m['/'] = 2;m['('] = 3; m[')'] = 3;int flag = 0;string str;cin >> str;for( int i = 0; i < str.size(); i++ ){//判断代码当中是否有数字 或则小数点 或则是 这个数带符号(负号)  if( ( ((i == 0) || str[i - 1] == '(') && (str[i] == '+' || str[i] == '-'))// 如果是负数则 eg(-10)  其中 i = 0 考虑到 第一个数 如果是 eg +10 || ( str[i] >='0' && str[i] <= '9') || ( str[i] == '.' )){if(flag != 0 ){cout << ' ';	} if( str[i] != '+'){cout << str[i];//此处是如果输出的是负号 则输出 如果是正号则不输出 }//这是要输出的数字eg 5.5 while( (str[i+1] == '.') || (str[i + 1] >= '0' && str[i + 1] <= '9')){ i++;cout << str[i];} flag = 1;} else{if(str[i] == ')'){while(!s.empty() && s.top() != '('){cout << ' ' << s.top();s.pop();	}s.pop();//将栈中的'(' 删除 }else if(s.empty() || m[str[i]] > m[s.top()]){s.push(str[i]);	}else{//将优先级小于str[i] 输出去 但没遇到')' 所以 '(' 不用输出 while( !s.empty() && s.top() != '('){cout << ' ' << s.top();s.pop();	}	s.push(str[i]);} 					} 	}//将栈中剩余的符号输出来while(!s.empty()){cout << ' ' << s.top();s.pop(); } } 

在这里插入图片描述

四:学习总结

做题都一样遇到要考的算法不懂的就学,比如这个题当中这个转换法则就是学的,但是这个题自己做了两遍(每一遍花费4个多小时)都没做出来 ,自己考虑的点 不周 还有 算法 不精湛,最后第三遍 参考了网上大佬的解法 但我都吃透大佬的代码 自己又敲了一遍,菜鸟变大佬 ,我还有很长的路要走 如果你也是 那好 我们一块加油 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构思维其实就那么回事

一提到架构&#xff0c;对于工作经验不多的小伙伴来说会心生敬畏之心。觉得是一个很高端、很难、很有挑战的事情。没错&#xff0c;架构不像我们平时的coding工作&#xff0c;这是一个宏观层面的事情。而对我们内心来说&#xff0c;越宏观、越大的东西&#xff0c;我们总会觉得…

python原理及代码_原理+代码|详解层次聚类及Python实现

前言聚类分析是研究分类问题的分析方法&#xff0c;是洞察用户偏好和做用户画像的利器之一。聚类分析的方法非常多&#xff0c;能够理解经典又最基础的聚类方法 —— 层次聚类法(系统聚类) 的基本原理并将代码用于实际的业务案例是本文的目标&#xff0c;同时这也会为理解后续与…

Java但中获取时间将时间转换成字符串格式(年月日格式)

一:直接上马拿走&#xff1a; package cn.wyj.one;import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date;/*** 测试时间对象和字符串之间的相互转化* DateFormat抽象类和SimpleDateFormat实现类的使用* author 86155**/public class Demo2…

一行代码就可以替换n个仓储文件

&#xff08; 且放白鹿青崖间&#xff0c;须行即骑访名山 &#xff09;终于还是要面对这个问题了&#xff0c;一直想着可以逃避它&#xff0c;自从18年就开始纠结这个问题&#xff0c;后来看了DDD&#xff0c;然后也收集了很多的设计思想&#xff0c;发现一个框架除了稳定性&am…

JAVA当中Calendar类打印日历表单

一&#xff1a;引言 代码当中注释很详尽&#xff0c;直接上码&#xff1b; 二&#xff1a;上码 package cn.wyj.one;import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date…

基于.NetCore3.1系列 —— 日志记录之日志配置揭秘

前言在项目的开发维护阶段&#xff0c;有时候我们关注的问题不仅仅在于功能的实现&#xff0c;甚至需要关注系统发布上线后遇到的问题能否及时的查找并解决。所以我们需要有一个好的解决方案来及时的定位错误的根源并做出正确及时的修复&#xff0c;这样才能不影响系统正常的运…

7-21 求前缀表达式的值 (25 分)(思路详解)

一&#xff1a;题目 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前&#xff0c;例如23*(7-4)8/4的前缀表达式是&#xff1a; 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。 输入格式: 输入在一行内给出不超过…

java当中递归打印目录树

一&#xff1a;上码 package cn.wyj.one;import java.io.File;public class Demo8_递归打印目录树 {public static void main(String[] args) {File f new File("C:/亚洲");printfile(f,0);}static void printfile(File f,int level){for( int i 0; i < level;…

今天你内卷了吗?

点击蓝字关注&#xff0c;回复“职场进阶”获取职场进阶精品资料一份最近「内卷」这个词大火&#xff0c;朋友圈、知乎、腾讯新闻、B站视频&#xff0c;铺天盖地。大家的议论充满了愤懑、不安、失望和愤怒。那么&#xff0c;什么是内卷&#xff1f;内卷并不是一个新词&#xff…

python中的正则表达式re模块_python中的正则表达式(re模块)

特殊字符"."  &#xff1a; Matches any character except a newline.匹配任何字符 除了换行符"^"  :匹配字符的开头1 importre2 sre.findall(^c234,ac2324)3 s1re.findall(^ac,ac2324)4 print(s)5 print(s1)6 #输出&#xff1a;[]7 # [ac]"$&quo…

.NET Core + Spring Cloud:服务注册与发现

毫无疑问&#xff0c;微服务架构是目前的主流&#xff0c;在微服务架构下&#xff0c;服务治理、负载均衡、服务熔断、配置中心、API网关 等都是需要关注的问题&#xff0c;当然不是非要全部完善后才能进行微服务开发&#xff0c;在很多项目团队中&#xff0c;初期可能会将某个…

python语言中不用来定义函数的关键字_Python 语言中用来定义函数的关键字是

Python 语言中用来定义函数的关键字是答&#xff1a;def调查问卷采集是数据采集人员通过设计具有针对性的问卷,采用方式进行信息采集答&#xff1a;以上都是中国大学MOOC: 突出重点&#xff0c;必须以解决问题为目标。也就是说&#xff0c;重点内容的训练&#xff0c;必须实现预…

C++中getline()和cin()同时使用时的注意事项

一&#xff1a;问题 当用cin输入完后 然后再用getline()的话就会直接结束没办法在输入了 问题分析&#xff1a; cin只是在缓存区中&#xff0c;把字符读走&#xff0c;会剩余/n在缓存区中&#xff0c;但是getline对/n极度敏感&#xff0c;导致getline刚开始读入便遇到/n于是…

api接口返回动态的json格式?我太难了,尝试一下 linq to json

一&#xff1a;背景1. 讲故事前段时间和一家公司联调api接口的时候&#xff0c;发现一个奇葩的问题&#xff0c;它的api返回的json会动态改变&#xff0c;简化如下&#xff1a;{"Code":101,"Items":[{"OrderTitle":"订单1"}]}{"C…

mysql id 字段类型转换_mysql 数据类型转换

一、问题有一张如下图所示的表&#xff0c;需要我们查出 result 值大于 reference_high值的数据然后我们写了下面的SQL查询语句SELECT i.result,i.reference_high FROM report_item iLEFT JOIN report r ON r.idi.report_idWHERE r.org_id54 AND r.report_status1AND r.add_dat…

7-22 堆栈模拟队列 (25 分)(详解夹思路)

一&#xff1a;题目 设已知有两个堆栈S1和S2&#xff0c;请用这两个堆栈模拟出一个队列Q。 所谓用堆栈模拟队列&#xff0c;实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S)&#xff1a;判断堆栈S是否已满&#xff0c;返回1或0&#xff1b; int IsEmpty (Stack …

What is 测试金字塔?

【答疑解惑】| 作者 / Edison Zhou这是恰童鞋骚年的第271篇原创内容我的女朋友是一名测试工程师&#xff0c;但她之前却不知道测试金字塔的概念&#xff0c;为此我曾经在家里的白板上画了一个图一层一层给她讲解过。我和同事在给团队面试测试和开发岗位时&#xff0c;也会必问到…

Mysql编码教程_mysql编码设置教程 mysql编码要怎么设置呢

mysql的默认编码是拉丁&#xff0c;每次JSP制作网页用insert语句插入数据库时汉字都会显示成问号&#xff0c;安装mysql后&#xff0c;启动服务并登陆&#xff0c;使用show variables命令可查看mysql数据库的默认编码:由上图可见database和server的字符集使用了latin1编码方式&…

技术脱钩后软硬件磨合优化不失为一条出路

从宏观上看&#xff0c;这一论的制裁只是一连串组合拳的一次攻击&#xff0c;将来&#xff0c;东亚大国和西方技术脱钩是大趋势。在这种背景下&#xff0c;宜建立红色产业链。指导方针是不过度追求局部指标的先进性&#xff0c;而是追求技术自主性&#xff0c;并把握整体性能达…

7-23 还原二叉树 (25 分)(分析加详解)

一&#xff1a;题目&#xff1a; 给定一棵二叉树的先序遍历序列和中序遍历序列&#xff0c;要求计算该二叉树的高度。 输入格式: 输入首先给出正整数N&#xff08;≤50&#xff09;&#xff0c;为树中结点总数。下面两行先后给出先序和中序遍历序列&#xff0c;均是长度为N的…