【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;
}
目录
相关文章
|
7月前
PTA-第3章-13 字符串替换
编写程序,将字符串中大写字母按A-&gt;Z, B-&gt;Y, ..., X-&gt;C, Y-&gt;B, Z-&gt;A的规则替换。输入为不超过80字符的字符串,输出替换后的字符串。例如,&quot;Only the 11 CAPItaL LeTtERS are replaced.&quot; 转换为 &quot;Lnly the 11 XZKRtaO OeGtVIH are replaced.&quot;
74 1
数据结构实验之栈与队列二:一般算术表达式转换成后缀式
数据结构实验之栈与队列二:一般算术表达式转换成后缀式
|
2月前
|
存储 算法 Java
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
前缀(波兰)表达式、中缀表达式和后缀(逆波兰)表达式的基本概念、计算机求值方法,以及如何将中缀表达式转换为后缀表达式,并提供了相应的Java代码实现和测试结果。
133 0
数据结构与算法学习八:前缀(波兰)表达式、中缀表达式、后缀(逆波兰)表达式的学习,中缀转后缀的两个方法,逆波兰计算器的实现
|
6月前
|
人工智能 Java vr&ar
必知的技术知识:HDU6345:子串查询(前缀和)
必知的技术知识:HDU6345:子串查询(前缀和)
38 0
|
7月前
|
C语言
算术操作符、赋值操作符、复合赋值符
这篇文档介绍了算术和赋值操作符。算术操作符包括加&quot;+&quot;、减&quot;-&quot;、乘&quot;×&quot;、除&quot;/&quot;和求余&quot;%”,其中求余只适用于整数,结果正负由第一个运算数决定。赋值操作符有&quot;=&quot;用于给变量赋值,而复合赋值符如&quot;+=&quot;、&quot;-=&quot;等则结合了运算和赋值功能,简化代码编写。
42 1
|
7月前
|
存储 C语言
C语言程序设计——赋值表达式
C语言程序设计——赋值表达式
中缀表达式转前缀或后缀并计算结果 2021-04-28
中缀表达式转前缀或后缀并计算结果 2021-04-28
|
存储 算法
每日一题——逆波兰表达式求值(前缀、中缀、后缀表达式的说明,库函数atoi()的解析)
每日一题——逆波兰表达式求值(前缀、中缀、后缀表达式的说明,库函数atoi()的解析)
每日三题-组合总和、全排列、括号生成
每日三题 组合总和 全排列 括号生成
92 0
每日三题-组合总和、全排列、括号生成
|
机器学习/深度学习 存储
【每日一题Day85】LC1807 替换字符串中的括号内容 | 哈希表 双指针
如果当前字符不是左括号,那么将其直接放入结果末尾;如果是左括号,那么搜索括号内的单词,然后进行替换。
96 0

热门文章

最新文章