逆波兰表达式求值(后缀表达式求值)

题目描述:

根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1:

输入:tokens = [“2”,“1”,"+",“3”,"*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:

输入:tokens = [“4”,“13”,“5”,"/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

解题思路:
1.遇到操作数,入栈
2.遇到操作符,就把栈顶的数据,拿出来运算,将结果入栈

中缀转后缀:
1.遇到操作数输出(或储存)
2.遇到操作符,若栈为空,入栈;若这个操作符比栈顶的优先级高,入栈
3.栈不为空,这个操作符比栈顶的优先级低或相等,出栈顶的运算符,这个操作符(低级操作符)入栈
4.直到中缀表达式结束

class Solution {
public:
    void getOPNum(stack<int>& st,int& left,int& right)
    {
        right = st.top();
        st.pop();
        left = st.top();
        st.pop();
    }
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for(const auto& str:tokens)
        {
            int left,right;
            switch(str[0])
            {
                case '+':
                    getOPNum(st,left,right);
                    st.push(left+right);
                    break;
                case '-':
                    if(str.size() == 1)   //考虑负数
                    {
                        getOPNum(st,left,right);
                        st.push(left-right);
                        break;
                    }
                    else
                    {
                        st.push(stoi(str));  //是负数则转为整型
                    }
                    break;
                    
                case '*':
                    getOPNum(st,left,right);
                    st.push(left*right);
                    break;
                case '/':
                    getOPNum(st,left,right);
                    st.push(left/right);
                    break;
                default:
                     st.push(stoi(str));//字符串转整型
                break;
            }
        }
        return st.top();
    }
};

或者直接取str的后面的数,忽略负数的符号

class Solution {
public:
    void getOPNum(stack<int>& st,int& left,int& right)
    {
        right = st.top();
        st.pop();
        left = st.top();
        st.pop();
    }
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        for(const auto& str:tokens)
        {
            int left,right;
            switch(str.back())
            {
                case '+':
                    getOPNum(st,left,right);
                    st.push(left+right);
                    break;
                case '-':
                    getOPNum(st,left,right);
                    st.push(left-right);
                    break;
                case '*':
                    getOPNum(st,left,right);
                    st.push(left*right);
                    break;
                case '/':
                    getOPNum(st,left,right);
                    st.push(left/right);
                    break;
                default:
                     st.push(stoi(str));//字符串转整型
                break;
            }
        }
        return st.top();
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值