day 11 第五章 栈与队列

day 11 第五章 栈与队列今日内容:
*
20. 有效的括号
*
1047. 删除字符串中的所有相邻重复项
*
150. 逆波兰表达式求值

详细布置20. 有效的括号
讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。
大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html1047. 删除字符串中的所有相邻重复项
栈的经典应用。
要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。
题目链接/文章讲解/视频讲解:https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html150. 逆波兰表达式求值
本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题
题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html

#if 0
class Solution {
public:
    bool isValid(string s) {
        if (s.size % 2 != 0) return false;
        stack<char> st;
        for (auto ch : s) {
            if (ch == '(' || ch == '{' || ch == '[') {
                st.push(ch);
            } else {
                if (ch == ')') {
                    if (!st.empty() && st.top() == '(') st.pop();
                    else return false;
                } else if (ch == '}') {
                    if (!st.empty() && st.top() == '{') st.pop();
                    else return false;
                } else {
                    if (!st.empty() && st.top() == '[') st.pop();
                    else return false;
                }
            }
        }
        return st.empty();
    }
};
#endif

class Solution {
public:
    bool isValid(string s) {
        if (s.size() % 2 != 0) return false; 
        stack<char> st;
        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();
    }
};
class Solution {
public:
    string removeDuplicates(string s) {
        string result;
        for (auto ch : s) {
            if (!result.empty() && result.back() == ch) result.pop_back();
            else result.push_back(ch);
        }
        return result;
    }
};
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> nums;
        long long result, lhs, rhs;
        for (auto str : tokens) {
            if (str == "+" || str == "-" || str == "*" || str == "/") {
                rhs = nums.top();
                nums.pop();
                lhs = nums.top();
                nums.pop();
                if (str == "+") result = lhs + rhs;
                if (str == "-") result = lhs - rhs;
                if (str == "*") result = lhs * rhs;
                if (str == "/") result = lhs / rhs;
                nums.push(result);
            } else {
                nums.push(strtoint(str));
            }
        }
        return nums.top();
    }
    long long strtoint(string &s) {
        long long result = 0;
        long long sign = 1;
        for (auto ch : s) {
            if (ch == '-')  sign = -1;
            else if (ch == '+') sign = 1;
            else result = ((ch - '0') + result * 10);
        } 
        return result * sign;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值