LeetCode每日一题:150. 逆波兰表达式求值

题目描述


在这里插入图片描述


数据示例

数据示例


数据范围

在这里插入图片描述


首先我们先要知道什么是逆波兰表达式。如下:
在这里插入图片描述

找规律发现(其实题目已经给出了)逆波兰表达式可以用数据结构栈来求。

主要思路
  • 遍历整个字符串数组
  • 如果该字符串是数字(需要写一个check函数来判断),那么就把该字符串转换为int类型的数字,然后压入栈。
  • 如果该字符串是运算符,那么取出当前栈上的前两个元素,然后做运算。

主要坑点
  • 当字符数组的长度为1的时候,答案就是该数字。
  • 运算的时候,假设一开始栈顶元素是a,出栈后,栈顶元素是b(相当于运算的两个数,所以要出栈两次),那么应该是b去运算a,例如运算符是 ‘/’ 或 ‘-’ 的时候,应该是b - a或者b / a。(楼主因为一开始直接拿a运算b然后调试了很久……)
  • 假如遍历到的字符串为负数,那么应该判断他的长度是否大于1,(因为我是拿字符串的第一个字符来判断的,具体看我的check()函数),因为第一个字符如果为 ‘-’ 的话,可能这个数是负数,也有可能是减号。

这三个坑点直接令我WA了三次。。害。。


AC代码
class Solution {
public:

    bool check(const string &s){
        char ch = s[0];
        if(ch == '-' && s.size() > 1) return true;
        if(ch == '+' || ch == '-' || ch == '*' || ch == '/') return false;
        return true;
    }

    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        int ans = stoi(tokens[0]);
        for(int i = 0, n = tokens.size(); i < n; i++){
            if(check(tokens[i])){
                int t = stoi(tokens[i]);
                st.push(t);
            }else{
                int a = st.top();st.pop();
                int b = st.top();st.pop();
                if(tokens[i][0] == '+') ans = b + a;
                else if(tokens[i][0] == '-') ans = b - a;
                else if(tokens[i][0] == '*') ans = b * a;
                else ans = b / a;
                st.push(ans);
            }
        }
        return ans;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就一枚小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值