代码随想录算法训练营第11天|20.有效的括号 1047.删除字符串中的所有相邻重复项

20.有效的括号

        栈类的题目都很神奇,这道题分有不有效有三种情况,一种是左括号多了,一种是右括号多了,一种是左括号和右括号不匹配。我们设置一个栈来放s[i]所对应的右括号,如果s[i]==‘{’,那么就在栈里放‘}’,依次类推.......假如遇到的是一个右括号,那么就看看它和栈顶元素是否匹配(因为栈顶元素对应的是最近的一个左括号),如果不匹配就返回false,对应的是左括号和右括号不匹配的情况。假如说还没把s遍历完,栈就为空了,说明这时候右括号多了,也返回false,最后怎么判断左括号多了的情况呢?就看遍历完后栈是否为空,不为空说明左括号多了,不匹配。

https://leetcode.cn/problems/valid-parentheses/

class Solution {
public:
    bool isValid(string s) {
     stack<char>right;
     for(int i=0;i<s.size();i++)
     {
        if(s[i]=='{')
        {
            right.push('}');
        }
        else if(s[i]=='(')
        {
            right.push(')');
        }
        else if (s[i]=='[')
        {
            right.push(']');
        }
        else if(right.empty()||right.top()!=s[i])
        return false;
        else
        right.pop();
     }
     return right.empty();
    }
};

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

        这道题和上一道题的内核有点像,本质上都是消消乐,即遇到匹配的元素就两个一起销毁。所以一开始的思路是先设置一个栈,然后遍历给定的字符串s,如果s[i]==栈顶元素,说明可以消消乐了,所以stack.pop(),然后我们再把栈里面的元素取出来,但由于是先进后出,所以结果还得reverse。不过,我们也可以用字符串来模拟栈,这样就不用reverse,相当换了一个方向,我们还是遍历字符串,如果s[i]和result的最后一个元素相同,那么就消消乐,result.pop_back(),注意,这里的前提条件是栈即字符串result不能为空;如果元素不同,那么result.push_back(s[i])。

https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/

class Solution {
public:
    string removeDuplicates(string s) {
           string result;
            for(int i=0;i<s.size();i++)
            {   
                if(!result.empty()&&s[i]==result.back())
                {
                    result.pop_back();
                }
                else
                {
                    result.push_back(s[i]);
                 }
            }    
            return result;
    }
};

150.逆波兰表达式求值

        这道题还是采用消消乐的方法,一旦遇到符号就把栈顶元素和栈顶元素的下一个元素进行运算,然后又返回栈里。这道题看似简单,实际上有几个小细节需要注意:虽然tokens[i]对应的都只是一个字符,但是它还是字符串,所以判断的时候要写tokens[i] == "+"而不能写tokens[i] == ‘+’,注意单引号和双引号的区别,同时,我们把元素入栈的时候,由于是把字符串入栈,所以要先把字符串转换为int类型再放入栈中,所以要用stoi函数, st.push(std::stoi(tokens[i]));最后,我们要得到结果,这时候需要取出栈里面的结果,就要用到stack.top()。

https://leetcode.cn/problems/evaluate-reverse-polish-notation/

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int>st;
        for(int i=0;i<tokens.size();i++)
        {
           if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") 
            {
                int num1=st.top();st.pop();
                int num2=st.top();st.pop();
                int temp;
                if(tokens[i]=="+")
                {
                    temp=num2+num1;
                }
                else if(tokens[i]=="-")
                {
                    temp=num2-num1;
                }
                else if(tokens[i]=="*")
                {
                    temp=num2*num1;
                }
                else if(tokens[i]=="/")
                {
                    temp=num2/num1;
                }
                st.push(temp);
            }
            else
            {
                st.push(std::stoi(tokens[i]));
            }
        }
        int result=st.top();
        st.pop();
        return result;
    }
};

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值