第五周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 进程 进程就是处于执行期的程序(目标码存放在某种存储介质上),但进程并不仅仅局限于一段可执行程序代码.通常进程还要包含其他资源,像打开的文件,挂起的信 ...
随机推荐
- Skywalking-12:Skywalking SPI机制
SPI机制 基本概述 SPI 全称 Service Provider Interface ,是一种服务发现机制.通过提供接口.预定义的加载器( Loader )以及约定俗称的配置(一般在 META-I ...
- VUE自学日志01-MVC和MVVM
一.需要了解的基础概念 Model(M)是指数据模型,泛指后端进行的各种业务逻辑处理和数据操控,主要围绕数据库系统展开.这里的难点主要在于需要和前端约定统一的接口规则. View(V)是视图层,也就是 ...
- NOIP 模拟九 考试总结
T1 考场上先干的T2,最后慌慌张张没去想正解,打算把树建起来,拿70分的部分分,于是写树剖LCA,板子好像忘了,回忆了好久还模拟了好几遍才打对树剖LCA............期望70,结果0.考试 ...
- RAC使用auto rolling的方式打补丁
11.2.0.4 RAC 某系统主库使用auto rolling的方式打补丁在一节点执行1-5,结束后然后在二节点执行1-5,结束后最后再在某个节点执行6. 1.backup GI_HOME& ...
- 微服务+异步工作流+ Serverless,Netflix 决定弃用稳定运行 7 年的旧平台
作者 | Frank San Miguel 策划 | 田晓旭 2021 年,Netflix 会将大部分的工作负载从 Reloaded 转移到 Cosmos 平台.Cosmos 是一个计算平台,它将微服 ...
- Linux中的文件使用FTP进行文件备份
注意!!! 本文是在linux中进行ftp备份(备份到另一个linux服务器) 上传思路: 1.每次上传文件时, 后台接收文件, 使用transferTo上传到Linux服务器 2.把文件路径 + F ...
- Mybatis、maven项目中整合log4j (17)
Mybatis.maven项目总整合log4j java 中Mybatis.maven项目总整合log4j 1.pom增加log4j包引用 2.添加 log4j.properties文件 # java ...
- 3.3 Execution Flow of a DDD Based Application 基于DDD的应用程序执行流程
3.3 Execution Flow of a DDD Based Application 基于DDD的应用程序执行流程 The figure below shows a typical reques ...
- 如何快速体验鸿蒙全新声明式UI框架ArkUI?
HDC2021将于10月22日在东莞松山湖正式开幕,大会将设立Codelab体验专区,超多好玩.有趣的Demo等你体验.想快速入门HarmonyOS?学习HarmonyOS新特性?以下几个Codela ...
- redis5集群搭建步骤
通常情况下为了redis的高可用,我们一般不会使用redis的单实例去运行,一般都会搭建一个 redis 的集群去运行.此处记录一下 redis5 以后 cluster 集群的搭建. 一.需求 red ...