信息学奥赛复赛复习08-CSP-J2020-03表达式前置知识点-后缀表达式、栈、字符读取

news/2024/10/1 15:51:44
PDF文档公众号回复关键字:20241001

1 P1449 后缀表达式

[题目描述]

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)

本题中运算符仅包含 + - * / 。保证对于 / 运算除数不为 0。特别地,其中 /运算的结果需要向 0 取整(即与 C++ / 运算的规则一致)。

如:3(5-2)+7 对应的后缀表达式为:3.5.2.-7.+@ 。在该式中,@ 为表达式的结束符号。. 为操作数的结束符号

[输入格式]

输入一行一个字符串 ss,表示后缀表达式

[输出格式]

输出一个整数,表示表达式的值

[输入输出样例]

输入 #1

3.5.2.-*7.+@

输出 #1

16

输入 #2

10.28.30./*7.-@

输出 #2

-7

说明/提示

数据保证,1≤∣s∣≤50,答案和计算过程中的每一个值的绝对值不超过 10^9

2 相关知识点

1) 栈

栈又名堆栈,是一种限定仅在表尾进行插入和删除操作的线性表,这一端称为栈顶,另一端称为栈底

栈中的数据元素遵守后进先出的原则

2) 字符读取

getchar读取字符

#include<bits/stdc++.h>
using namespace std;
char c;//定义字符c 
int main(){while(c!='\n'){//不是换行 继续读下一个字符 c=getchar();//读取1个字符 赋值给c变量 cout<<c<<" ";//输出 }return 0;
}
/*
输入 
12345
输出 
1 2 3 4 5
*/ 

3) 后缀表达式

后缀表达式,也称为逆波兰表达式,是一种算术表达式表示方法,其中运算符位于操作数之后

//示例1 中缀表达式a+b对应的后缀表达式C++
a b+
//示例2 中缀表达式3+4*2对应的前缀表达式3 4 2 * +    

3 思路分析

1依次读入 3 5 2这3个操作数

2 读入操作符 - 此时从栈中读入栈顶的2个元素,y和x对y和x进行计算后的结果放入栈中x-y=5-2=3

3 读入操作符 *  此时从栈中读入栈顶的2个元素,y和x对y和x进行计算后的结果放入栈中x*y=3*3=9

4 读入操作符 +  此时从栈中读入栈顶的2个元素,y和x对y和x进行计算后的结果放入栈中x+y=9+7=16此时栈顶元素就是此后缀表达式的计算结果

示例程序

#include<bits/stdc++.h>
using namespace std;
stack<int> st;//栈 用来保存操作数 
//sum 保存操作数 每次读取1个字符,有可能多位 
int sum,x,y;//x和y临时保存从栈中取出的2个数 
char c;//每次读取一个字符 
int main(){while(c!='@'){//如果字符不是@ 说明没结束 c=getchar();//读取1个字符 if(c=='+'){//如果是+ y=st.top();//从栈中取出栈顶第1个数 st.pop();//从栈中弹出 x=st.top();//从栈中取出栈顶第2个数st.pop();//从栈中弹出st.push(x+y);//2个数的和存入栈中 }else if(c=='-'){//如果是-y=st.top();//从栈中取出栈顶第1个数st.pop();//从栈中弹出x=st.top();//从栈中取出栈顶第2个数st.pop();//从栈中弹出st.push(x-y);//第2个数-第1个数存入栈中 }else if(c=='*'){//如果是*y=st.top();//从栈中取出栈顶第1个数st.pop();//从栈中弹出x=st.top();//从栈中取出栈顶第2个数st.pop();//从栈中弹出st.push(x*y);//两个数乘积放入栈中 }else if(c=='/'){//如果是 / y=st.top();//从栈中取出栈顶第1个数st.pop();//从栈中弹出x=st.top();//从栈中取出栈顶第2个数st.pop();//从栈中弹出st.push(x/y);//第2个数/第1个数存入栈中 }else if(c=='.'){//如果是. 说明操作数读取结束 操作数sum放入栈中 st.push(sum);sum=0;//清除m 继续读下一个操作数 }else{sum=sum*10+c-'0';//按位累加操作数 }}cout<<st.top();//此时栈顶元素就计算结果 return 0;
} 

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

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

相关文章

IDEA如何查看已经安装的插件并删除

前言 我们在使用IDEA开发时,经常需要安装一些插件来帮助我们高效快速的处理问题,可以说很实用。 不过有时候,我们不想使用某个插件了,或者某个插件突然不好用了,想要先删除下再安装,那么我们应该怎么删除我们已经安装的插件呢? 如何删除插件 首先,我们点击【File】->…

python中列表和字符串的相互转换

001、列表转换为字符串>>> list1 [xxx, yyy, zzz] >>> "".join(list1) ## 使用字符串内置函数join + 可迭代对象 xxxyyyzzz >>> "_".join(list1) xxx_yyy_zzz 002、字符串转换为列表>>> str1 = &qu…

Cookie,Session与Token

参考资料 水平有限,欢迎交流!仅做学习交流使用 一定要看,非常透彻!【Cookie、Session、Token究竟区别在哪?如何进行身份认证,保持用户登录状态?】 黑马jwt详解 Javaweb程序设计与项目案例 郭煦 直接上结论 共同点 Cookie,Session与Token 三者都实现了 Http 无状态这一特…

A. 2025--[炼石计划--NOIP模拟三]--T1--矩形

赛时草了个 \(O(n^4 \log (n))\) 竟然能过 70 分虽然本来就是这么分配的,发现正解只需将二分改为双指针就可以了,最气的是上面计算的时候用到还是尺取下面就用的二分(唐诗)。 其实这题就是暴力,然后在低级的暴力上加一些操作变得稍微高级一点。 计算的话直接暴力查找不同颜…

深度学习(UNet)

和FCN类似,UNet是另一个做语义分割的网络,网络从输入到输出中间呈一个U型而得名。 相比于FCN,UNet增加了更多的中间连接,能够更好处理不同尺度上的特征。 网络结构如下:下面代码是用UNet对VOC数据集做的语义分割。import torch import torch.nn as nn import torch.optim …

【防忘笔记】测试过程与技术

测试人员应该想些什么 我自己是做后端的,对于模棱两可的需求和莫名其妙的测试case是深恶痛绝的,所以有时候我就会想测试人员应该会需要注意什么?以他们的角度,他们更在乎什么 最近有机会了解相关的知识,遂整理记录一下,以便之后在工作中更好的理解发生的各种事情 以客户为…

论文总结1--基于深度强化学习的四足机器人步态分析--2024.10.01

四足机器人的运动控制方法研究 1.传统运动控制 - 基于模型的控制方法目前,在四足机器人研究领域内应用最广泛的控制方法就是基于模型的控制方法,其中主要包括基于虚拟模型控制(Virtual Model Control,VMC)方法 、基于零力矩点(Zero Moment Point,ZMP) 的控制方法、弹簧…

Linux系统密码忘记

Linux系统密码忘记 1.故障背景误删除或修改/etc/passwd导致无法远程登录. 禁止root远程登录,没有添加普通用户,无法远程登录. root密码忘记,无法远程登录. linux无法启动.2.解决方法 root密码,恢复有备份的系统文件,都要重启系统,才能进入救援模式.解决方案 应用场景系统自带的…