算法day32 逆波兰表达式求值

题目描述

思路:栈
人类理解的计算顺序对于计算机而言是无法理解的,由于计算机无法自主识别优先级,所以我们采取逆波兰式使得一个计算表达式可以避免对于括号加优先级的操作,依旧能够保持正确的模式。逆波兰式由此而生。本题我们可以采用栈的方式,在入栈过程中判断当前的字符串是否是运算符,若是运算符,我们就弹出栈顶与次栈顶的元素并作对应运算符的操作,得到的数值继续压栈,随着循环的进行直至对于字符串数组的遍历结束,此时栈中就剩下唯一的数字,即是最终的运算结果。

代码如下

public:
stack<int> st;
int str2int(string s){
    int k = 1;
    int sum = 0;
    if(s[0]=='-'){//识别是否是负数
        s[0] = '0';
    }
    for(int i=s.size()-1;i>=0;i--){
        sum += (s[i] - '0')*k;
        k *= 10;
    }
    if(s[0] == '0'){//是负数将其转换成整数的结果取负
        sum = -sum;
    }
    return sum;
}
int evalRPN(vector<string>& tokens) {
    int len = tokens.size();
    for(int i=0;i<len;i++){
        if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
            int num2 = st.top();
            st.pop();
            int num1 = st.top();
            st.pop();
            if(tokens[i]=="+") st.push(num1+num2);
            if(tokens[i]=="-") st.push(num1-num2);
            if(tokens[i]=="*") st.push(num1*num2);
            if(tokens[i]=="/") st.push(num1/num2); 
        }else{
            st.push(str2int(tokens[i]));
        }
    }
    return st.top();
}

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

END

posted on 2025-05-21 15:17  sakura430  阅读(7)  评论(0)    收藏  举报