class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 给定一个后缀表达式,返回它的结果
* @param str string字符串
* @return long长整型
*/
long long legalExp(string str) {
// write code here
//本题逻辑不难,需要注意数据类型,避免溢出
long long sum{};//用于记录字符串中的数字
int k{};
long long s1{},s2{},ret{};//用于计算字符串中的运算符
stack<long long> a;//定义一个栈
for(int i=0;i<str.size();i++)
{
if(str[i]>=48&&str[i]<=57){//如果遇到数字(判断条件来自ASCII码)
k=str[i]-'0';//将字符数字转化为整数
sum=sum*10+k;//转化为整数
}
else if(str[i]=='#')
{
a.push(sum);//遇到井字符就将数字入栈
sum=0;//重置sum
}
else//其他情况就只有运算符号了,因为数据合法所以不需要考虑空栈
{
s1=a.top();//取出栈顶数据
a.pop();//出栈
s2=a.top();//再次取出
a.pop();//再次出栈
if(str[i]=='*')//判断符号并运算,下同
ret=s1*s2;
else if(str[i]=='+')
ret=s1+s2;
else if(str[i]=='-')
ret=s2-s1;
a.push(ret);//将运算结果入栈
}
}
return a.top();//显然操作后栈顶数据即为所求的值
}
};