后缀表达式

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

如:中缀表达式 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笔记 后缀表达式+后缀表达式计算的更多相关文章

  1. 第十四,十五周PTA作业

    1.第十四周part1 7-3 #include<stdio.h> int main() { int n; scanf("%d",&n); int a[n]; ...

  2. 《Linux内核分析》第五周学习笔记

    <Linux内核分析>第五周学习笔记 扒开系统调用的三层皮(下) 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.c ...

  3. 20165326 java第五周学习笔记

    第五周学习笔记 ch7 内部类(&外嵌类) 内部类的类体不可以声明类变量和方法 内部类如同类的变量或方法 内部类和外嵌类在编译时生成两个class文件 匿名类 某个类的一个子类没有明显的用类声 ...

  4. 《Linux内核设计与实现》第五周读书笔记——第十一章

    <Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ...

  5. linux内核分析第五周学习笔记

    linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  6. Linux内核分析——第五周学习笔记

    第五周 扒开系统调用的“三层皮”(下) 一.知识点总结 (一)给MenuOS增加time和time-asm命令 在实验楼中,首先 强制删除menu (rm menu -rf) 重新克隆一个新版本的me ...

  7. 20135320赵瀚青LINUX第五周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 按照刘老师的周从三个角 ...

  8. 第六周PTA笔记 括号匹配调整+堆放石子+最大积分+168

    括号匹配调整 如果通过插入" +"和" 1"可以从中得到格式正确的数学表达式,则将带括号的序列称为正确的. 例如,序列 "(())()",& ...

  9. 《Linux内核分析与实现》 第五周 读书笔记

    第3章 进程管理 20135307张嘉琪 3.1 进程 进程就是处于执行期的程序(目标码存放在某种存储介质上),但进程并不仅仅局限于一段可执行程序代码.通常进程还要包含其他资源,像打开的文件,挂起的信 ...

随机推荐

  1. 电商管理后台 API 接口文档

    1. 电商管理后台 API 接口文档 1.1. API V1 接口说明 接口基准地址:http://127.0.0.1:8888/api/private/v1/ 服务端已开启 CORS 跨域支持 AP ...

  2. Stream之高级函数

    上回文说到了有关Stream一些数学函数的用法.今天来说下Stream一些高级的函数用法,这些函数在日常工作中也是必不可少的,测试数据还是引用上一篇的数据. Map 这个方法我个人称之为转换函数,把一 ...

  3. SpringBoot之网站的登陆注册逻辑

    网站的登录注册实现逻辑 该文章主要是为了整理之前学习项目中的知识点,并进行一定程度的理解. 技术列表: SpringBoot MySQL redis JWT 用户登录逻辑: 首先打开前端登录页面,F1 ...

  4. 20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测

    作者 | 江昱 前言 图像分类是人工智能领域的一个热门话题.通俗解释就是,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法. 它利用计算机对图像进行定量分析,把图像或图像中 ...

  5. 从零入门 Serverless | 课时5 函数的调试与部署

    作者 | 江昱 阿里巴巴高级产品经理 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 S ...

  6. perl合并文件

    使用Perl合并文件 有时需要将整个目录下的小文件合并到一个文件中,以便查阅检索 特性 整个目录完全遍历,自动存入单个文件顺序遍历文件 待合并的目录 合并后的文件内容 syscfg/test1 sys ...

  7. javascript-jquery介绍

    jquery优势 1.轻量级 2.强大的选择器 3.出色的DOM封装 4.可靠的事件处理机制 5.完善的Ajax 6.不污染顶级变量 7.出色的浏览器兼容 8.链式操作方式 9.隐式迭代 10.行为层 ...

  8. HCNP Routing&Switching之BGP防环机制和路由聚合

    前文我们了解了BGP路由宣告相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15440860.html:今天我们来聊一聊BGP防环机制和路由聚合相关话题 ...

  9. seata整合多数据源

    seata整合多数据源 一.背景 二.整合步骤 1.seata server的搭建 2.引入数据源切换组件 3.引入seata组件 4.配置多数据源 5.关闭seata自己默认的数据源代理 6.配置s ...

  10. activiti流程图上获取各节点的信息获取

    背景:         由于项目的需要,当用户在查看流程图时,当点击某个流程图片上的节点时,需要提示一些信息,这就需要获取各个节点的信息,此处获取id和name的值.           注意:这个并 ...