力扣 150. 逆波兰表达式求值

本题使用栈数据结构根据逆波兰表达式计算算术表达式的值,逆波兰表达式也叫后缀表达式,将操作数放在前面,操作符放在后面,避免了使用括号和优先级歧义。本题关键点在于理解用栈计算后缀表达式的逻辑和如何判断一个字符数组中的各个字符串(含负数)是否为数字,而不是运算符。

下面代码采取的是首先判断字符数组中字符串长度,如果大于1,说明不只一个数,是十位以上的正数或者负数,不会是运算符。然后再判断或者字符串的第一个位置是数字,说明是个位的正数。

除去这种方法以外,因为运算符的种类是固定的,可以先判断是否是加减乘除运算符,如果不是,则是数字。

时间复杂度:O(n),空间复杂度:O(n)

思路:

  1. 定义一个栈st,对于每个token进行判断。
  2. 如果token的长度大于1(负数或者十位以上的正数)或者第一个字符是数字(正数),则将字符串转换成整数并将其压入栈st中。
  3. 否则说明token[i]是运算符,弹出栈顶的两个元素a和b,根据运算符计算结果并将结果压入栈st中。
  4. 返回栈顶元素即为最后的表达式的计算结果。

代码:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for (int i = 0; i < tokens.size(); i++) {
            if (tokens[i].size() > 1 || isdigit(tokens[i][0])) // token长度大于1或者第一个字符是数字
                st.push(stoi(tokens[i]));
            else {
                int b = st.top();
                st.pop();
                int a = st.top();
                st.pop();
                int result;
                if (tokens[i] == "+")
                    result = a + b;
                else if (tokens[i] == "-")
                    result = a - b;
                else if (tokens[i] == "*")
                    result = a * b;
                else if (tokens[i] == "/")
                    result = a / b;
                st.push(result);
            }
        }
        return st.top();
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值