【PTA】后缀表达式计算

简介: 【PTA】后缀表达式计算

目录

1.题目描述

2.输入输出

3.解题思路

4.样例解析

5.代码实现

1.题目描述1.png

Kunkun学长觉得应该让学弟学妹了解一下这个知识点:后缀表达式相对于中缀表达式更容易让计算机理解和学习。

现在kunkun学长给出一串后缀表达式,你能帮他算出这个后缀表达式的值吗?

第一行输入后缀表达式长度n(1<=n<=25000);

第二行输入一个字符串表示后缀表达式

(每个数据或者符号之间用逗号隔开,保证输入的后缀表达式合法,每个数包括中间结果保证不超过long long长整型范围)


2.输入输出2.png


输入样例:

14

2,10,2,+,6,/,-

输出样例:

0


3.解题思路

后缀表达式,本质上就是给计算机读取的语言。

后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则

规则:从左向右扫描,遇到数字压栈,遇到操作符,弹出栈顶的两个元素,先弹出的元素在右边,后弹出来的在左边,进行计算后,将结果压栈,再往后扫描,直到扫描结束,输出栈顶元素,即为最终结果。

4.样例解析

下面以 14  2,10,2,+,6,/,-为例子来讲讲计算机的转换过程。


1. 首先读入 14 ,表示一共有14个字符


2.从左向右开始遍历表达式,首先遇到2, 将其入栈


   栈的情况:2


3.从左向右开始遍历表达式,然后遇到10, 将其入栈


   栈的情况:2,10


4.从左向右开始遍历表达式,然后遇到2, 将其入栈


   栈的情况:2,10,2


5.从左向右开始遍历表达式,然后遇到+, 取出 2 和 10, 计算出 2 + 10 = 12,将12入栈


   栈的情况:2,12


6.从左向右开始遍历表达式,然后遇到6, 将其入栈


   栈的情况:2,12,6


7.从左向右开始遍历表达式,然后遇到 / , 取出10 和 6, 计算出 10 / 6 = 2 ,将 2 入栈


   栈的情况:2,2


8.从左向右开始遍历表达式,然后遇到 -  , 取出2 和 2, 计算出 2 - 2 = 0 ,将 0 入栈


   栈的情况:0 (最后结果)

5.代码实现

🌈 5.1  数字情况

将其整个数字遍历,然后计算出数字的真实大小4.png

if(s[i] >='0'&&s[i] <='9')
        {
intj=i+1;
while(s[j] >='0'&&s[j] <='9') j++ ; j-- ;
for(; i<=j; i++ )
            {
tmp=tmp*10+ (s[i] -'0');
            }
q[++tt] =tmp;
tmp=0, i=j;
        }

🌈 5.2  逗号情况

5.png


🌈 5.3  (坑点)负数的情况6.png

elseif(s[i] =='-'&&s[i+1] >='0'&&s[i+1] <='9')
        {
intj=i+1; i++ ;
while(s[j] >='1'&&s[j] <='9') j++ ; j-- ;
for(; i<=j; i++ )
            {
tmp=tmp*10+ (s[i] -'0');
            }
q[++tt] =tmp*-1;
tmp=0, i=j;
        }

🌈 5.4  其他运算符的情况7.png

记得整个原则:  先弹出的元素在右边,后弹出来的在左

else        {
LLnum1=q[tt-- ];
LLnum2=q[tt-- ];
if(s[i] =='+') q[++tt] =num1+num2;
elseif(s[i] =='-') q[++tt] =num2-num1;
elseif(s[i] =='*') q[++tt] =num2*num1;
elseif(s[i] =='/') q[++tt] =num2/num1;
        }

完整代码

#include <iostream>#include <cstring>#include <stack>usingnamespacestd;
typedeflonglongLL;
intn;
strings;
LLq[25010];
inthh=0, tt=-1;
intmain()
{
cin>>n;
LLtmp=0;
cin>>s;
for(inti=0; i<n; i++ )
    {
if(s[i] >='0'&&s[i] <='9')
        {
intj=i+1;
while(s[j] >='0'&&s[j] <='9') j++ ; j-- ;
for(; i<=j; i++ )
            {
tmp=tmp*10+ (s[i] -'0');
            }
q[++tt] =tmp;
tmp=0, i=j;
        }
elseif(s[i] ==',') continue;
elseif(s[i] =='-'&&s[i+1] >='0'&&s[i+1] <='9')
        {
intj=i+1; i++ ;
while(s[j] >='1'&&s[j] <='9') j++ ; j-- ;
for(; i<=j; i++ )
            {
tmp=tmp*10+ (s[i] -'0');
            }
q[++tt] =tmp*-1;
tmp=0, i=j;
        }
else        {
LLnum1=q[tt-- ];
LLnum2=q[tt-- ];
if(s[i] =='+') q[++tt] =num1+num2;
elseif(s[i] =='-') q[++tt] =num2-num1;
elseif(s[i] =='*') q[++tt] =num2*num1;
elseif(s[i] =='/') q[++tt] =num2/num1;
        }
    }
cout<<q[tt] <<endl;
return0;
}
目录
相关文章
数据结构中公式前中后缀表达式-二叉树应用
数据结构中公式前中后缀表达式-二叉树应用
|
19天前
|
传感器 安全 算法
uwb人员定位卡的功能、原理和应用场景详解
UWB人员定位卡基于超宽带技术,实现亚米级高精度定位,支持SOS报警、低功耗运行及多场景融合定位。广泛应用于工业、医疗、司法等领域,提升安全监管与管理效率。如果您想进一步了解定位的案例,欢迎关注、评论留言~也可搜索lbs智能定位。
|
6月前
|
存储 人工智能 运维
防御OSS Bucket泄露:RAM权限策略+日志审计+敏感数据扫描三重防护
云存储安全三重防护体系,聚焦RAM权限控制、日志审计与敏感数据扫描,通过策略精控、异常检测与主动扫描构建闭环防御,有效应对配置错误导致的数据泄露风险,提升企业云上数据安全性。
458 0
|
4月前
|
机器学习/深度学习 新能源 调度
电力系统短期负荷预测(Python代码+数据+详细文章讲解)
电力系统短期负荷预测(Python代码+数据+详细文章讲解)
413 1
|
3月前
|
存储 负载均衡 数据库
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
本文介绍基于华为AGC的端云一体化开发流程,涵盖项目创建、云函数开通、应用配置及DevEco集成。重点讲解云函数的编写、部署、调用与传参,并涉及环境变量设置、负载均衡、重试机制与熔断策略等高阶特性,助力开发者高效构建稳定云端服务。
438 1
鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇
|
安全 网络协议 网络安全
【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题
【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题
26092 0
|
NoSQL Java Redis
Reactor实战,创建一个简单的单线程Reactor(理解了就相当于理解了多线程的Reactor)
本文通过一个简单的单线程Reactor模式的Java代码示例,展示了如何使用NIO创建一个服务端,处理客户端的连接和数据读写,帮助理解Reactor模式的核心原理。
184 0
Reactor实战,创建一个简单的单线程Reactor(理解了就相当于理解了多线程的Reactor)
|
算法 Python 容器
Python常见操作的时间复杂度
本文整理了Python中常见数据结构操作的时间复杂度,旨在帮助大家了解Python操作的性能,协助运行更快的代码。
611 0
Python常见操作的时间复杂度
|
存储 自然语言处理 安全
安全小课堂丨什么是暴力破解?如何防止暴力破解
暴力破解是通过尝试所有可能的密码组合来解密,基于字符集合、有限密码长度和可预测性假设。黑客利用此方法获取未经授权的访问,如入侵系统或账户,可能为了利润、数据盗窃、恶意软件传播等目的。常见的攻击类型包括简单暴力、字典式、混合、反向和撞库。防御措施包括使用复杂密码、双因素认证、限制登录尝试和利用密码管理器。加密、加盐和实时监控也能增强安全性。
|
机器学习/深度学习