贤鱼的刷题日常(数据结构栈学习)--P1175 表达式的转换--题目详解

news2024/12/27 13:45:28

🏆今日学习目标:
🍀例题讲解P1175 表达式的转换
✅创作者:贤鱼
⏰预计时间:25分钟
🎉个人主页:贤鱼的个人主页
🔥专栏系列:c++
🍁贤鱼的个人社区,欢迎你的加入 贤鱼摆烂团

请添加图片描述

P1175 表达式的转换

  • 表达式的转换
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 提示
  • 思路
  • AC代码

表达式的转换

题目描述

平常我们书写的表达式称为中缀表达式,因为它将运算符放在两个操作数中间,许多情况下为了确定运算顺序,括号是不可少的,而后缀表达式就不必用括号了。

后缀标记法:书写表达式时采用运算紧跟在两个操作数之后,从而实现了无括号处理和优先级处理,使计算机的处理规则简化为:从左到右顺序完成计算,并用结果取而代之。

例如:8-(3+2*6)/5+4 可以写为:8 3 2 6 * + 5 / - 4 +

其计算步骤为:

8 3 2 6 * + 5 / - 4 +
8 3 12 + 5 / - 4 +
8 15 5 / - 4 +
8 3 - 4 +
5 4 +
9

编写一个程序,完成这个转换,要求输出的每一个数据间都留一个空格。

输入格式

就一行,是一个中缀表达式。输入的符号中只有这些基本符号 0123456789+-*/^(),并且不会出现形如 2*-3 的格式。

表达式中的基本数字也都是一位的,不会出现形如 12 形式的数字。

所输入的字符串不要判错。

输出格式

若干个后缀表达式,第 i + 1 i + 1 i+1 行比第 i i i 行少一个运算符和一个操作数,最后一行只有一个数字,表示运算结果。

样例 #1

样例输入 #1

8-(3+2*6)/5+4

样例输出 #1

8 3 2 6 * + 5 / - 4 + 
8 3 12 + 5 / - 4 + 
8 15 5 / - 4 + 
8 3 - 4 + 
5 4 + 
9

样例 #2

样例输入 #2

2^2^3

样例输出 #2

2 2 3 ^ ^
2 8 ^
256

提示

运算的结果可能为负数,/ 以整除运算。并且中间每一步都不会超过 2 31 2^{31} 231。字符串长度不超过 100 100 100

注意乘方运算 ^ 是从右向左结合的,即 2 ^ 2 ^ 32 ^ (2 ^ 3),后缀表达式为 2 2 3 ^ ^

其他同优先级的运算是从左向右结合的,即 4 / 2 / 2 * 2((4 / 2) / 2) * 2,后缀表达式为 4 2 / 2 / 2 *

保证不会出现计算乘方时幂次为负数的情况,故保证一切中间结果为整数。

思路

我们首先来拆分一下题目

  • 中缀表达式转换后缀表达式
  • 后缀表达式逐步计算输出过程

我们来一步步解决问题
首先来处理一下中缀表达式转换
这里我们将问题继续细分
转换主要有一下几个问题

  • +=/*按照什么顺序转换
  • 如何处理^
  • 如何处理()

众所周知,+=*/涉及一个先后顺序的问题,也就是优先度
先乘除后加减这是小学必备敲门砖
首先写一个函数处理一下顺序问题

int pd(char t){
	switch(t){
		case '+':return 1;
		case '-':return 1;
		case '*':return 2;
		case '/':return 2;
		case '^':return 3;
		case '(':return 0;
		case ')':return 0;
		default:return -1;
	}
}

没毛病吧

从现在开始,我们默认+ -是1,*/是2

用一个op栈存一下符号,记得保证符号的顺序上升
同时遇到左括号入栈,遇到右括号输出左右括号内部符号
遇到数字直接输出就好了

8-(3+2*6)/5+4-----8 3 2 6 * + 5 / - 4 +
通过讲解一下例题解释为什么上升以及括号问题
首先入栈-
接着入栈(+*
然后入栈)
这时候输出括号内的内容,顺序应该是*+(栈内先进后出)8 3 2 6 * +get
此时栈内还有一个-,接着入栈/
注意这时候入栈了一个+,所以输出/-
最后结束的时候判断一下op,有东西全部输出就好了

因为先乘除后加减,如果此时入栈了一个*接着入栈了一个+,因为 * +前面运算,所以我们要弹出*
注意!!!直到弹出到比+优先度小的符号停止弹出,
为什么等于也要弹出?
咱俩优先度一样你在前头你先走

^就是个搅屎棍,需要单独处理
也很简单,题目中说了乘方运算从右向左结合,所以我们判断优先度的时候判断下,如果栈顶和输入元素都是^,直接break,和后面的内容说再见(反正从右往左咱俩都不走等到遇到比咱小的符号一起走)

整完了吧,处理一手运算问题
我们在上一个部分输出的时候记录一个栈ls,用来储存输出第一行的结果(注意此时是倒序,第一部分结束以后我们用一个fh栈来储存结果正序)
怎么运算?
遇到数字输出到num栈,遇到符号弹出num栈栈顶元素*2进行运算,运算完入栈输出就好,完事了
确实就是这么简单,写一个运算函数就好

int js(int x,int y,char t){
	switch(t){
		case '+':return x+y;
		case '-':return x-y;
		case '*':return x*y;
		case '/':return x/y;
		case '^':return pow(x,y);
		default:return -0x3f3f3f3f;//到不了这里不用管他
	}
}

注意输出的时候注意一下输出顺序
比如我们的num栈在一波操作下应该是数字的倒叙,输出的话需要反过来输出
fh栈相当于剩下的没有处理的部分,直接输出就好了,我们这里直接输出,记录一下然后再反过来塞回去,这个不慌看代码就懂了
然后继续重复上述操作,直到fh栈为空,这里num还剩一个,刚好输出答案
结束了,休息休息

AC代码

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
stack<char>da,op;
char a;
int js(int x,int y,char t){
	switch(t){
		case '+':return x+y;
		case '-':return x-y;
		case '*':return x*y;
		case '/':return x/y;
		case '^':return pow(x,y);
		default:return -0x3f3f3f3f;
	}
}
int pd(char t){
	switch(t){
		case '+':return 1;
		case '-':return 1;
		case '*':return 2;
		case '/':return 2;
		case '^':return 3;
		case '(':return 0;
		case ')':return 0;
		default:return -1;
	}
}
stack<char>fh;
stack<int>nm;
stack<char>ls;
int wc;
void work(){
	while(cin>>a){
		if(isdigit(a)){
			da.push(a);
			char cc=da.top();
			ls.push(cc);
			cout<<cc<<" ";
		}else{
			if(pd(a)==0){
				if(a=='(') op.push(a);
				else{
					while(!op.empty()&&op.top()!='('){
						cout<<op.top()<<" ";
						ls.push(op.top());
						op.pop();
					}
					op.pop();
				}
			}

			else if(pd(a)>=1&&pd(a)<=3){
				if(!op.empty()){
					while(!op.empty()&&pd(a)<=pd(op.top())){
					if(pd(op.top())==pd(a)&&pd(a)==3) break;
					cout<<op.top()<<" ";
					ls.push(op.top());
					if(!op.empty())op.pop();
					}
				}
				op.push(a);
			}
		}
	}
	while(!op.empty()){
		ls.push(op.top());
		cout<<op.top()<<" ";
		op.pop();
	}
}
stack<int>num;
char t;
void cal(){
	while(!fh.empty()){
		t=fh.top();
		fh.pop();
		if(isdigit(t)){
			num.push(t-'0');
		}else{
			int x=num.top();
			num.pop();
			int b=num.top();
			num.pop();
			int sz=js(b,x,t);
			num.push(sz);
			while(!num.empty()){//反过来
				nm.push(num.top());
				num.pop();
			}
			while(!nm.empty()){//反过来
				cout<<nm.top()<<" ";
				num.push(nm.top());
				nm.pop();
			}
			while(!fh.empty()){//反过来
				cout<<fh.top()<<" ";
				op.push(fh.top());
				fh.pop();
			}
			while(!op.empty()){//反过来
				fh.push(op.top());
				op.pop();
			}
			cout<<endl;
		}
	}
}
int main(){
	work();
	while(!ls.empty()){//反过来
		fh.push(ls.top());
		ls.pop();
	}
	cout<<endl;
	cal();
	return 0;
}

请添加图片描述

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

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

相关文章

ServletConfig 和 ServletContext

1 ServletConfig 1.1 ServletConfig 介绍 ServletConfig 是 Servlet 的配置参数对象&#xff0c;在 Servlet 的规范中&#xff0c;允许为每一个 Servlet 都提供一些初始化的配置。所以&#xff0c;每个 Servlet 都有一个自己的 ServletConfig。作用&#xff1a;在 Servlet 的…

静息态fMRI中的非线性功能网络连接

在这项工作中&#xff0c;我们关注功能网络中的显式非线性关系。我们介绍了一种使用归一化互信息(NMI)计算不同大脑区域之间非线性关系的技术。我们使用模拟数据演示了我们提出的方法&#xff0c;然后将其应用到Damaraju等人先前研究过的数据集。静息状态fMRI数据包括151名精神…

玩转高并发,17年开发经验架构师,历时三年编写Java高并发三部曲

前言 5G&#xff0c;IO&#xff0c;多屏合一&#xff0c;方物互联时代来了&#xff01;太分n式、高并发、微服务架构己经成为Java后端应用的主流架构。但是对Java高并发&#xff0c;springcloudRPC底层原理、Nginx底层原理等核心知识&#xff0c;广大的Java开发同学们相对欠缺…

【踩坑汇总】CLion开启QT编程

一下全部内容全都是大佬lht的经验&#xff0c;我只是记录一下给大家。 问题&#xff1a;Qt5Config.cmake找不到 解决办法&#xff1a; set(CMAKE_PREFIX_PATH "E:/Qt/Qt5.12.11/5.12.11/mingw73_64/lib/cmake/Qt5") 找到Qt5Config.cmake路径&#xff0c;添加上面这…

东南亚LazadaShopee文具类目好做吗?一文带你了解各国热销及需求品类

在东南亚&#xff0c;消费者刚刚经历完双11独有的“速度与激情”——11月11日00&#xff1a;11&#xff0c;开售11分钟&#xff0c;Lazada平台的销售额相比日销暴涨124倍&#xff1b;早上8&#xff1a;17&#xff0c;第一单跨越重洋的中国跨境商品就已成功送达签收。 东南亚&a…

Listen,Attend,and Spell(LAS)——李宏毅人类语言处理学习笔记3

Listen Encoder目标&#xff1a; 去掉noises&#xff0c;提取出相关信息 encoder有很多做法&#xff1a; CNN见文章&#xff1a;CNN-卷积神经网络 self-attention见文章self-attention Pyramid RNN将两个结合&#xff0c;然后送到下一层。Pooling over time则是两个中取一…

代谢组学文献分享:地中海饮食、血浆代谢组和心血管疾病风险

​全球三分之一的死亡由心血管疾病造成&#xff0c;2015-2020年美国膳食指南建议&#xff0c;地中海饮食是预防心血管疾病的一项重要且具有成本效益的战略措施。代谢组学文献分享&#xff0c;发表在期刊European Heart Journ-al&#xff08;IF 22.637&#xff09;上题目为“Th…

网络协议

网络通信协议&#xff1a;计算机网络中实现通信必须有一些约定&#xff0c;即通信协议&#xff0c;对速率、传输代码、代 码结构、传输控制步骤、出错控制等制定标准。 问题&#xff1a;网络协议太复杂&#xff1a;计算机网络通信涉及内容很多&#xff0c;比如指定源地址和目标…

【多标签, 极限的多标签算法】评价指标梳理

具体研究多标签和极限多标签 (XML) 的时候, 合理使用评价指标是关键. 最近在研究极限多标签算法的时候发现了它和传统多标签算法的评价指标是有异的, 而且我曾经积累的传统多标签评价指标也没有一个系统的体系 (很混乱). 于是写下本文用于自我总结. 查询目录<想看什么直接通…

语音识别翻译怎么做?这些方法值得收藏

随着网络的不断发展&#xff0c;我们可以通过网络与世界各地的网友进行聊天。小伙伴们平时会和外国人交流吗&#xff1f;如果是文字聊天&#xff0c;我们看不懂的时候&#xff0c;还可以直接复制文字进行翻译。那如果外国网友发了段语音&#xff0c;结果我们大部分内容听不懂的…

电力行业人员定位管理解决方案之智能巡检

智能巡检引入大数据分析理念&#xff0c;通过数字化技术实现对生产现场各关键要素的全面感知和实时互联&#xff0c;形成项目现场“数据一个库、监管一张网、管理一条线“。 在信息技术高速发展的今天&#xff0c;传统人工巡视、手工纸介质记录的工作方式已经无法满足电力设备巡…

第7章 博客文章的前端渲染显示

说实话本人通过Vue页面实现前端对后端数据的渲染显示也是初学咋练&#xff0c;但后端实现本人却是老鸟&#xff0c;对于后端开发者来说如果&#xff0c;渲染显示的软件是浏览器&#xff0c;除非团队中有Vue方面的大拿&#xff0c;不管是PC浏览器还是移动PC浏览器&#xff0c;Ra…

元宇宙初体验

14天学习训练营导师课程&#xff1a; 张子良《 元宇宙体系结构、关键技术和实践探索》 前言 最近这段时间加入勤学会的学习中&#xff0c;我加入的是元宇宙相关的学习组&#xff0c;为什么我选择元宇宙&#xff0c;不仅因为元宇宙是应用场景和生活方式的未来&#xff0c;而且元…

启动 idea 弹出“Failed to load JVM DLL\bin\server\jvm.dll”错误的解决方法

打开idea报failed to load JVM DLL 原因1&#xff1a; 查看是否缺少Microsoft Visual C 2010 Redistributable Package x64&#xff0c;没有则安装。 地址&#xff1a; 32 bit: http://www.microsoft.com/download/en/details.aspx?id5555 64 bit: http://www.microsoft.com…

面试必问 创建10个a点击弹出下标

<script> // for (let i 1; i <11; i) { // var adocument.createElement("a"); // a.href"#"; // a.innerHTML"<br />a标签"i // document.body…

JDBC获取数据库连接

Driver接口实现类 Driver接口介绍 java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的&#xff0c;不同数据库厂商提供不同的实现。 在程序中不需要直接去访问实现了 Driver 接口的类&#xff0c;而是由驱动程序管理器类(java.sql.…

Android学习---zygote(上)

Zygote意思是受精卵&#xff0c;它在Java世界中起到了很重要的作用&#xff0c;Android是基于Linux内核的&#xff0c;SDK是基于Java世界的&#xff0c;native语言是基于C和C&#xff0c;起初一定是先存在native世界&#xff0c;那么Java世界是如何创建的&#xff1f;这就与zyg…

『LeetCode|每日一题』---->打家劫舍||

目录 1.每日一句 2.作者简介 『LeetCode|每日一题』打家劫舍|| 1.每日一题 2.解题思路 2.1 思路分析 2.2 核心代码 2.3 完整代码 2.4 运行结果 1.每日一句 任何事情把期待值降到最低&#xff0c;所有遇见的都是礼物 2.作者简介 &#x1f3e1;个人主页&#xff1a;XiaoXia…

github数据怎么Python爬取

爬虫流程 在上周写完用scrapy爬去知乎用户信息的爬虫之后&#xff0c;github上star个数一下就在公司小组内部排的上名次了&#xff0c;我还信誓旦旦的跟上级吹牛皮说如果再写一个&#xff0c;都不好意思和你再提star了&#xff0c;怕你们伤心。上级不屑的说&#xff0c;那就写…

网站页面SEO优化方案

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 背景说明 针对网页面而提供相应的产品页面 SEO 优化部署方案&#xff0c;使其产品页面符合 SEO 规范&#xff0c;且能尽快获得产品词的较好排名。 产品相关页面URL命名 URL 结构对于网站页面的 seo 来说非常重要…