lc[栈与队列]---150.逆波兰表达式求值

0.踩雷:有关size_t 、long long int 和stoi、atoi

           C++ string类型转化为int类型(两种方法)_

        ①atoi是将const char* 转化为int类型,但用size_t来接收的时候,会出现溢出的现象

        ②stoi是将const string转化为int类型,同样的也不能用size_t来接收参数

    解决:用long long int 来接收

一、题目描述

         个人原先的解法:

class Solution 
{
public:
    bool checkIsNum(string ch)
    {
        string tmplate[4]={"+","-","*","/"};
        bool flg=true;
        for(string v:tmplate)
        {
            if(v==ch)
                flg=false;
        }
        return flg;
    }
    int evalRPN(vector<string>& tokens) 
    {
        stack<long long int> nums;
        string tmp;long long int left=0,right=0;//左右操作数
        for(auto v:tokens)
        {
            tmp=v.c_str();              //tmp是const char*类型
            if(checkIsNum(tmp))
                nums.push(stoi(tmp));   //是数字才需要atoi进行转化为数字
            else//说明是操作符
            {
                right=nums.top();nums.pop();
                left=nums.top();nums.pop();
                switch(tmp.c_str()[0])
                {
                    case '+':
                        nums.push(left+right);break;
                    case '-':
                        nums.push(left-right);break;
                    case '*':
                        nums.push(left*right);break;
                    case '/':
                        nums.push(left/right);break;
                }
            }
        }
        return nums.top();
    }
};

 三、参考代码

参考代码很简洁,建议学习这种风格

class Solution {
public:
    int evalRPN(vector<string>& tokens)
        {
        stack<int> st;
        for (int i = 0; i < tokens.size(); i++) 
        {
            if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
                long long int num1 = st.top();
                st.pop();
                long long int num2 = st.top();
                st.pop();
                if (tokens[i] == "+") st.push(num2 + num1);
                if (tokens[i] == "-") st.push(num2 - num1);
                if (tokens[i] == "*") st.push(num2 * num1);
                if (tokens[i] == "/") st.push(num2 / num1);
            } 
            else 
            {
                st.push(stoi(tokens[i]));
            }
        }
        int result = st.top();
        st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事)
        return result;
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Ocean__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值