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

文章介绍了如何使用栈解决编程问题,包括检查括号的有效性,删除字符串中的所有相邻重复项以及逆波兰表达式的求值。在括号问题中,通过栈来匹配左右括号;在删除重复项时,直接用字符串模拟栈操作;而在处理逆波兰表达式时,需要注意负数的情况,避免误将数字的第一个字符当作运算符。
摘要由CSDN通过智能技术生成

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();
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值