代码随想录算法训练营Day11 栈与队列part02 ● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值

20. 有效的括号

题目链接:20. 有效的括号 - 力扣(LeetCode)

文章链接:代码随想录 (programmercarl.com)

视频链接:栈的拿手好戏!| LeetCode:20. 有效的括号

代码随想录算法训练营Day11 栈与队列part02 ● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值_第1张图片

对称匹配的问题都可考虑用栈来解决,这道题也不例外。

栈解决的主要思想就是,遍历时,如果遇到'('、'['、'{'则分别将')'、']'、'{'入栈,遇到')'、']'、'{',就j进行出栈操作。

字符无效有三种情况,分别是左括号多了(遍历后栈里不为空),括号类型不匹配,遍历未结束但栈中已经为空,而遍历依旧要出栈操作。

代码如下:

class Solution {
public:
    bool isValid(string s) {
        stack st;
        if(s.size()%2!=0)//小小剪枝,奇数一定不符合
        {
            return false;
        }
        for(int i=0;i

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

 题目链接:Loading Question... - 力扣(LeetCode)

文章链接:代码随想录 (programmercarl.com)

视频链接:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项

代码随想录算法训练营Day11 栈与队列part02 ● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值_第2张图片

这道题也是栈的经典题型,通过遍历,元素与top相同则pop,不相同则push。

需要注意的是,如果按照从前往后的顺序遍历,最后遍历产生的栈,再依次出栈产生的字符串是反转的。有两种解决方法,第一种:是遍历时就从后往前遍历, for(int i=s.size()-1;i>=0;i--),第二种:就是最后结果通过字符串反转,如下:

reverse (result.begin(), result.end())

总代码如下:

class Solution {
public:
    string removeDuplicates(string S) {
        stack st;
        for (char s : S) {
            if (st.empty() || s != st.top()) {
                st.push(s);
            } else {
                st.pop(); // s 与 st.top()相等的情况
            }
        }
        string result = "";
        while (!st.empty()) { // 将栈中元素放到result字符串汇总
            result += st.top();
            st.pop();
        }
        reverse (result.begin(), result.end()); //库函数反转
        return result;

    }
};

 150. 逆波兰表达式求值

题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)

文章链接:代码随想录 (programmercarl.com)

视频链接:栈的最后表演! | LeetCode:150. 逆波兰表达式求值

代码随想录算法训练营Day11 栈与队列part02 ● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值_第3张图片

代码随想录算法训练营Day11 栈与队列part02 ● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值_第4张图片

 

这道题已给出提示,遇到数字则入栈,遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中,那思路其实就很明确了,通过for循环遍历,if条件语句判定,进一步操作,代码如下:

class Solution {
public:
    int evalRPN(vector& tokens) {
        stack st;
        for(int i=0;i

 

Day11 打卡成功,耗时1.5小时,较为轻松,再接再厉!!!!

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