【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;
}
目录
相关文章
|
3月前
|
存储 人工智能 运维
防御OSS Bucket泄露:RAM权限策略+日志审计+敏感数据扫描三重防护
云存储安全三重防护体系,聚焦RAM权限控制、日志审计与敏感数据扫描,通过策略精控、异常检测与主动扫描构建闭环防御,有效应对配置错误导致的数据泄露风险,提升企业云上数据安全性。
309 0
|
算法 Python 容器
Python常见操作的时间复杂度
本文整理了Python中常见数据结构操作的时间复杂度,旨在帮助大家了解Python操作的性能,协助运行更快的代码。
444 0
Python常见操作的时间复杂度
|
机器学习/深度学习 人工智能 安全
AI时代:程序员如何重塑核心竞争力
【8月更文第5天】近年来,人工智能(AI)和生成式预训练模型(AIGC)的飞速发展对软件开发行业产生了深远的影响。ChatGPT、Midjourney、Claude 等大语言模型的出现,不仅极大地提高了编程效率,还改变了程序员的工作方式。随着AI辅助编程工具的日益普及,程序员们面临着前所未有的机遇与挑战。本文旨在探讨在AI时代,程序员应如何调整自己的职业路径和发展策略,以保持和提升自身的竞争力。
1106 0
|
定位技术 API 数据格式
Element UI【详解】el-cascader 级联选择器 - 行政区划选择(可以选择任意一级),限定选择范围,获取并解析选中的节点
Element UI【详解】el-cascader 级联选择器 - 行政区划选择(可以选择任意一级),限定选择范围,获取并解析选中的节点
2605 0
|
机器学习/深度学习
|
存储 编解码 算法
无损压缩和有损压缩
【4月更文挑战第26天】无损压缩和有损压缩
872 2
|
算法
KMP算法详解
KMP算法详解
451 0
KMP算法详解
|
算法 Java C++
非启发式算法——二分、三分搜索算法
非启发式算法——二分、三分搜索算法
397 0
|
消息中间件 数据可视化 Shell
完美解决 RabbitMQ 可视化界面中 Overview 不显示图形的问题
完美解决 RabbitMQ 可视化界面中 Overview 不显示图形的问题
1101 0
|
存储 索引 NoSQL
二叉堆与自定义优先队列实现删除任意元素
二叉堆与自定义优先队列实现删除任意元素