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

20. 有效的括号

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

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

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

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

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

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

代码如下:

class Solution {
public:
    bool isValid(string s) {
        stack<int> st;
        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()==true||s[i]!=st.top()) return false;
            else st.pop();
        }
        if(st.empty()==false)
        {
            return false;
        }
        return true;
    }
};

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

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

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

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

这道题也是栈的经典题型,通过遍历,元素与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<char> 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. 逆波兰表达式求值

 

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

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> st;
        for(int i=0;i<tokens.size();i++)
        {
            if(tokens[i]=="+")
            {
                long long m,n;
                m=st.top();
                st.pop();
                n=st.top();
                st.pop();
                st.push(m+n);
            } 
            else if(tokens[i]=="-")
            {
                long long m,n;
                m=st.top();
                st.pop();
                n=st.top();
                st.pop();
                st.push(n-m);//注意!先出栈的是减数,后出栈的是被减数!
            }
            else if(tokens[i]=="/")
            {
                long long m,n;
                m=st.top();
                st.pop();
                n=st.top();
                st.pop();
                st.push(n/m);//注意@先出栈的是除数,后出栈的是被除数!
            }
            else if(tokens[i]=="*")
            {
                long long m,n;
                m=st.top();
                st.pop();
                n=st.top();
                st.pop();
                st.push(m*n);
            }
            else{
                st.push(stoll(tokens[i]));//将字符串转化为long long型变量
            }
        }
        return st.top();
    }
};

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值