第五周PTA笔记 后缀表达式+后缀表达式计算
后缀表达式
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级)。
如:中缀表达式 3(5–2)+7 对应的后缀表达式为:352-7+ 。
请将给出的中缀表达式转化为后缀表达式并输出。
输入格式:
输入仅一行为中缀表达式,式中所有数字均为个位数,表达式长度小于1000。
输出格式:
输出一行,为后缀表达式,式中无空格。
输入样例:
2+4*8+(8*8+1)/3
输出样例:
248*+88*1+3/+
发现一个宝藏博文中缀表达式转后缀表达式(非常简单易懂),通过一个同学的博客也发现了这个挺好的视频中缀表达式转后缀表达式(逆波兰表达式)冯强
思路其实大家都懂,就是写起来这错那错。我的代码比较复杂,但是总的逻辑是我自己比较明白的。就是交代一下需要注意的几个点,一开始测了很多数据在在自己电脑上运行都是对的,但交上去就全错,很崩溃啊,因为这个搞了好久。1.后来又想了一些可能的数据,例如1+2+3+4+5,像这样运算符连续相等的,这就让在if的判断多了一个条件。2.连续的括号到最后输出会多出来括号,例如((1+2)-(2-3))/6,在中间的判断运行部分没有改,因为数字和运算符的相对顺序是没有错的,于是就在最后输出的地方多了if判断。3.例如:12345+2-4*6/3,当一个比较低级的运算符后面有连续比较高级的运算符,就是后有连续的或,这个地方改得有点久,就是把if条件合并的地方拆开判断。
代码如下繁琐得很,就将就看吧哈哈哈
#include<stdio.h>
#include<string.h>
char s[1005],c[1005],a[1005];//数组a是储存操作符,数组c是储存最终答案
int judge(char x);//判断运算符的优先级
int main()
{
scanf("%s",s);
int i,r=0,t=0,n;
for(i=0;s[i]!='\0';i++)
{
if(s[i]>47&&s[i]<58){
c[r]=s[i];
r++;
}
else{
if(s[i]=='('){
a[t]=s[i];
t++;
i++;
while(s[i]!=')'){
if(s[i]>47&&s[i]<58){
c[r]=s[i];
r++;
i++;
}
else{
if(judge(a[t-1])>judge(s[i])&&a[t-1]!='('){
t--;
while(a[t]!='('){
c[r]=a[t];
r++;
t--;
}
t++;
a[t]=s[i];
t++;
i++;
}
else if(judge(a[t-1])==judge(s[i])&&a[t-1]!='('){//这一步就是上述提到的第三点
c[r]=a[t-1];
a[t-1]=s[i];
r++;
i++;
}
else{
a[t]=s[i];
t++;
i++;
}
}
}
t--;
while(a[t]!='('){
c[r]=a[t];
r++;
t--;
}
}//遇到()的情况
else{
if(judge(s[i])<judge(a[t-1])&&t>0){
t--;
while(t>=0){
c[r]=a[t];
r++;
t--;
}
t++;
a[t]=s[i];
t++;
}
else if(judge(s[i])==judge(a[t-1])&&t>0){//这一步就是上述提到的第三点
c[r]=a[t-1];
a[t-1]=s[i];
r++;
}
else{
a[t]=s[i];
t++;
}
}
}
}
t--;
while(t>=0){
c[r]=a[t];
t--;
r++;
}
n=strlen(s);
for(i=0;i<n;i++)
{
if(c[i]!='('&&c[i]!=')')printf("%c",c[i]);
}
return 0;
}
int judge(char x)
{
if(x=='+'||x=='-')return 1;
else if(x=='*'||x=='/')return 2;
else if(x=='^')return 3;
return 4;
}
后缀表达式计算
Kunkun学长觉得应该让学弟学妹了解一下这个知识点:后缀表达式相对于中缀表达式更容易让计算机理解和学习。现在kunkun学长给出一串后缀表达式,你能帮他算出这个后缀表达式的值吗?
输入格式:
第一行输入后缀表达式长度n(1<=n<=25000);
第二行输入一个字符串表示后缀表达式(每个数据或者符号之间用逗号隔开,保证输入的后缀表达式合法,每个数包括中间结果保证不超过long long长整型范围)
输出格式:
输出一个整数,即后缀表达式的值。
输入样例1:
6
10,2,+
输出样例1:
12
输入样例2:
14
2,10,2,+,6,/,-
输出样例2:
0
本题参考了后缀表达式C语言实现。
思路:用数组来做的,对于自己来说比较好理解。这题感觉比上一题让我容易理解,所以先写了这题,这个运算规则就是遇到运算符就将运算符的前两个数字进行运算。而用字符表示的数字不好计算,于是我将数字存在一个long long int的数组当中,并在计算过程中将计算得出的值存入这个数组的同时不断更新这个数组。
要注意以下几点:1.计算中可能会遇到负数,而数字前的"-"要和减号区别清楚,这要新列出一个情况。
2.我一开始设置的是long long int的整型,由于粗心在输入时写的是%d,在在自己的电脑上运行没错,到PTA上就段错误了,改过来之后就AC了。最后的输出也记得要写%lld,试验了一下,写%d会部分错误,写%ld也可以AC。
3.遇到和要分清楚哪个数字在前,也就是被除数或者被减数。
代码如下:
#include<stdio.h>
char s[25005];
long long int a[25005];
int main()
{
long long int n,i,t=0,r=0;
scanf("%lld %s",&n,s);
for(i=0;i<n;i++)
{
if(s[i]>47&&s[i]<58){
while(s[i]!=','){
a[r]=a[r]*10+(s[i]-'0');
i++;
}
r++;
}
else if(s[i]=='-'&&s[i+1]>47&&s[i+1]<58){
i++;
while(s[i]!=','){
a[r]=a[r]*10+(s[i]-'0');
i++;
}
a[r]=-a[r];
r++;
}
else if(s[i]=='+'){
a[r-2]=a[r-2]+a[r-1];
a[r-1]=0;
r--;
}
else if(s[i]=='-'){
a[r-2]=a[r-2]-a[r-1];
a[r-1]=0;
r--;
}
else if(s[i]=='/'){
a[r-2]=a[r-2]/a[r-1];
a[r-1]=0;
r--;
}
else if(s[i]=='*'){
a[r-2]=a[r-2]*a[r-1];
a[r-1]=0;
r--;
}
}
printf("%d",a[0]);
return 0;
}
第五周PTA笔记 后缀表达式+后缀表达式计算的更多相关文章
- 第十四,十五周PTA作业
1.第十四周part1 7-3 #include<stdio.h> int main() { int n; scanf("%d",&n); int a[n]; ...
- 《Linux内核分析》第五周学习笔记
<Linux内核分析>第五周学习笔记 扒开系统调用的三层皮(下) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...
- 20165326 java第五周学习笔记
第五周学习笔记 ch7 内部类(&外嵌类) 内部类的类体不可以声明类变量和方法 内部类如同类的变量或方法 内部类和外嵌类在编译时生成两个class文件 匿名类 某个类的一个子类没有明显的用类声 ...
- 《Linux内核设计与实现》第五周读书笔记——第十一章
<Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ...
- linux内核分析第五周学习笔记
linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析——第五周学习笔记
第五周 扒开系统调用的“三层皮”(下) 一.知识点总结 (一)给MenuOS增加time和time-asm命令 在实验楼中,首先 强制删除menu (rm menu -rf) 重新克隆一个新版本的me ...
- 20135320赵瀚青LINUX第五周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 按照刘老师的周从三个角 ...
- 第六周PTA笔记 括号匹配调整+堆放石子+最大积分+168
括号匹配调整 如果通过插入" +"和" 1"可以从中得到格式正确的数学表达式,则将带括号的序列称为正确的. 例如,序列 "(())()",& ...
- 《Linux内核分析与实现》 第五周 读书笔记
第3章 进程管理 20135307张嘉琪 3.1 进程 进程就是处于执行期的程序(目标码存放在某种存储介质上),但进程并不仅仅局限于一段可执行程序代码.通常进程还要包含其他资源,像打开的文件,挂起的信 ...
随机推荐
- Fiddler抓HTTPS接口数据,安装证书并不复杂,超详细的图文解说,不信你看!
@ 目录 前言 安装环境 配置网络 IP 端口 配置网络 浏览器打开下载链接 下载证书 安装证书 证书安装坑 前言 抓包是我测试工作中必须要学会的一个工具,我们都知道,抓取HTTPS接口里需要安装证书 ...
- 深入浅出WPF-08.Event( 事件)01
事件(Event) 首先我们来继续说一下UI组件树,因为WPF事件 的路由环境就是组件树.WPF中的树有两种,一种是逻辑树(Logical Tree),一种是可视元素树(Visual Tree).逻辑 ...
- State Space Model Content
State Space Model 状态空间模型及其卡尔曼滤波技术 混合正态分布下的状态空间模型及其滤波
- 关于国密HTTPS 的那些事(一)
关于国密HTTPS 的那些事(一) 随着<密码法>密码法的颁布与实施,国密的应用及推广终于有法可依.而对于应用国密其中的一个重要组成部分----国密HTTPS通信也应运而生.为了大家更好的 ...
- Jekins 插件Extended Choice Parameter显示Json Parameter Type遇到的问题
在jenkins中使用Extended Choice Parameter插件用来显示自定义的多选项,尝试通过groovy script来显示,正常,但查看它的例子,发现它例子中多选是通过类型 Json ...
- Data Interoperability Tools
这里的工具貌似没有对应函数~~~
- 「JOISC 2020 Day2」变态龙之色 题解
题目传送门 注意 同性必定不同色 必有一个同色异性,且不相互不喜欢 Solution 我们发现,我们问题比较大的就是如何确定性别问题.我们可以一个一个加进去,在原来已经确定了的二分图上增加新的性别关系 ...
- springboot事务的传播行为和隔离级别
springboot事务的传播行为和隔离级别 在springboot中事务的传播行为和隔离级别都是在TransactionDefinition这个接口中定义的 传播行为定义了7种,分别用0-6来表示 ...
- 自动化运维利器Ansible要点汇总
由于大部分互联网公司服务器环境复杂,线上线下环境.测试正式环境.分区环境.客户项目环境等造成每个应用都要重新部署,而且服务器数量少则几十台,多则千台,若手工一台台部署效率低下,且容易出错,不利后期运维 ...
- [对对子队]会议记录5.22(Scrum Meeting9)
今天已完成的工作 梁河览 工作内容:修改第一到九关新手引导,修复关卡选择bug 相关issue:优化初步导出版本 相关签入:fix:修改第一关到第九关的新手引导和地图场景的bug 马嘉 ...