算法刷题Day11 有效的括号+删除字符串中的所有相邻重复项+逆波兰表达式求值

Day 11 栈与队列

20. 有效的括号

被坑了两次。一次是只有左括号,一次是只有右括号。太着急了。面试的时候没处理好边界也是会被扣分的。

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;

        for (auto c : s)
        {
            switch (c)
            {
            case '(':
            case '[':
            case '{':
                stk.push(s[i]);
                break;
            case ')':
                if (!stk.empty() && stk.top() == '(')
                    stk.pop();
                else 
                    return false;
                break;
            case ']':
                if (!stk.empty() && stk.top() == '[')
                    stk.pop();
                else 
                    return false;
                break;
            case '}':
                if (!stk.empty() && stk.top() == '{')
                    stk.pop();
                else
                    return false;
                break;
            }
        }

        return stk.empty();
    }
};

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

直接使用string来模拟栈操作,代码更简洁。

class Solution {
public:
    string removeDuplicates(string s) {
        string ret;
        ret.reserve(s.size());

        for (auto c : s)
        {
            if (ret.size() && ret.back() == c)
            {
                ret.pop_back();
            }
            else
            {
                ret.push_back(c);
            }
        }
        // ret.shrink_to_fit();

        return ret;
    }
};

150. 逆波兰表达式求值

本来是打算这样写:

for (auto &token : tokens)
{
    ...
    switch (token[0])
    {
        case '+':
            break;
        case '-':
            val2 = stk.top();
            stk.pop();
            val1 = stk.top();
            stk.pop();
            ...
            break;
            ...
    }
}

但是有问题,别忘了数字的范围是[-200, 200],也就是说,如果是负数的话,它的第一位也是减号,会进入处理减号的case,不合理。

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> stk;

        for (auto &token : tokens)
        {
            int val1, val2, rst;
            
            if(token == "+" || token == "-" || token == "*" || token == "/")
            {
                val2 = stk.top();
                stk.pop();
                val1 = stk.top();
                stk.pop();

                switch (token[0])
                {
                case '+':
                    rst = val1 + val2;
                    break;
                case '-':
                    rst = val1 - val2;
                    break;
                case '*':
                    rst = val1 * val2;
                    break;
                case '/':
                    rst = val1 / val2;
                    break;
                }
                stk.push(rst);
            }
            else
            {
                stk.push(stoi(token));
            }
        }

        return stk.top();
    }
};

你可能感兴趣的:(算法)