逆波兰表达式

根据 逆波兰表示法,求表达式的值。

有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

注意 两个整数之间的除法只保留整数部分。

可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

 

示例 1:

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

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

首先了解一下逆波兰表达式,这个其实是一种后缀表达式,我们习惯的是中缀表达式,也就是1+2,但是计算机更加习惯于12+,对应于二叉树而言就是一个是中序遍历一个是后序遍历,实现的方法是用栈来记录这个过程,当碰到数字则进栈,要是碰到运算符,则计算。

这里还牵涉一个函数的使用stoi(string s,int begin,int number),begin代表开始的位置,number代表数量,最后转换成10进制

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int>st;
        for (int i = 0; i < tokens.size(); i++) {
            if (tokens.at(i) == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
                int num1 = st.top();
                st.pop();
                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 if (stoi(tokens[i],0,1)>=0&&stoi(tokens[i],0,1)<=9) {
                st.push(stoi(tokens[i]));
            }
        }
        return st.top();
    }
};

 

posted @ 2022-09-12 21:47  铜锣湾陈昊男  阅读(18)  评论(0)    收藏  举报