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();//显然操作后栈顶数据即为所求的值
    }
};