代码随想录算法训练营第十一天| 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项, 150. 逆波兰表达式求值

遇到【匹配】问题可以考虑stack!

20. 有效的括号

力扣

思路:遍历string的每一位,用stack记录,遇到匹配的就pop掉,如果最后stack为空则说明都被匹配,return true。

优化点:如果string的长度为奇数则一定不匹配。

 1047. 删除字符串中的所有相邻重复项

力扣

与上一题类似

代码随想录算法训练营第十一天| 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项, 150. 逆波兰表达式求值_第1张图片

也可以直接用一个string进行类似stack的操作。注意st.top()变为out.back(),st.pop()变为out.pop_back().

 代码随想录算法训练营第十一天| 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项, 150. 逆波兰表达式求值_第2张图片

150. 逆波兰表达式求值

力扣​​​​​​​
第一次看有点没看懂怎么运算的哈哈哈,但看了动画和说明明白了
大概就是依次push到stack里,遇到当前为【符号】的情况则要计算前面两位数字(e,g: 2 1 +,则需要计算2+1 = 3,然后用3覆盖2 1 +)。遇到数字直接push即可。
int evalRPN(vector& tokens){
    std::stack st; //注意类型为long long,避免数过大
    for(int i = 0; i < tokens.size(); i++){
        if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*"
            || tokens[i] == "/"){
            long long second = st.top(); //注意second和first的顺序!从stack中pop和正常顺序是相反的!
            st.pop();
            long long first = st.top();
            st.pop();
            if(tokens[i] == "+"){
                st.push(first + second);
            } else if (tokens[i] == "-"){
                st.push(first - second);
            } else if (tokens[i] == "*"){
                st.push(first * second);
            } else if (tokens[i] == "/"){
                st.push(first / second);
            }

        } else {
            st.push(stoll(tokens[i]);
        }
    }
    return st.top();
}    

你可能感兴趣的:(算法,leetcode,c++,数据结构)