代码随想录刷题第11天

第一题是有效的括号https://leetcode.cn/problems/valid-parentheses/description/,经典的括号匹配问题,主要是分清可能失配的三种情况:左括号多了,右括号多了,左右括号匹配不上。

class Solution {
public:
    stack st;
    bool isValid(string s) {
        if (s.size() % 2 != 0)
            return false;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(')
                st.push(')');
            else if (s[i] == '[')
                st.push(']');
            else if (s[i] == '{')
                st.push('}');
            else if (st.empty() || st.top() != s[i]) {
                return false;
            } else
                st.pop();
        }
        return st.empty();
    }
};

第一题相对简单。第二题是删除字符串中相邻重复项https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/,想了想没太明白如何合适的把字符串push进栈让相邻元素刚好消除。看看卡哥思路代码随想录,发现该题的思路和上一个符号匹配是类似的,扫描字符串,如果元素与栈顶元素相同,就弹出,不同就加入。

class Solution {
public:
    string removeDuplicates(string s) {
        stack st;
        for (char a : s) {
            if (st.empty() || a != st.top())
                st.push(a);
            else
                st.pop();
        }
        string result = "";
        while (!st.empty()) {
            result += st.top();
            st.pop();
        }
        reverse(result.begin(), result.end());
        return result;
    }
};

卡哥讲到甚至都不用这个栈,用字符串模拟一下功能就行,最后也免去反转了。

class Solution {
public:
    string removeDuplicates(string s) {
        string result;
        for (char a : s) {
            if(result.empty() || a != result.back()){
                result.push_back(a);
            }
            else result.pop_back();
        }
        return result;
    }
};

学到了字符串模拟栈,只对back处进行push_back,pop_back。妙啊。

第三题是著名的逆波兰表达式https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/,这玩意我一个门外汉都听说过。听听卡哥怎么说代码随想录。还是相当与两个相邻元素的消减,不过条件是遍历到运算符。

class Solution {
public:
    int evalRPN(vector& tokens) {
        stack st;
        for (int i = 0; i < tokens.size(); i++) {
            if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" ||
                tokens[i] == "/") {
                long long nums1 = st.top();
                st.pop();
                long long nums2 = st.top();
                st.pop();
                if (tokens[i] == "+")
                    st.push(nums1 + nums2);
                else if (tokens[i] == "-")
                    st.push(nums2 - nums1);
                else if (tokens[i] == "*")
                    st.push(nums1 * nums2);
                else
                    st.push(nums2 / nums1);
            } else
                st.push(stoll(tokens[i]));
        }
        return st.top();
    }
};

学到了将字符串转换为长整形的stoll()。很明显的看到,栈对相邻元素消减是很方便的。

你可能感兴趣的:(leetcode)