代码随想录算法训练营第11天,20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

20. 有效的括号

对于这道题,我们首先可以想到用栈进行处理,遇到左括号就放入栈,遇到右括号就出栈,看两个符号是否匹配,访问完字符串,若栈是空的,那么就说明全部都可以匹配的上。

代码

class Solution {
public:
    bool isValid(string s) {
        stack<char> sta;
        for(auto x:s)
        {
            if(x=='('||x=='['||x=='{')
                sta.push(x);
                else if(x==')'||x==']'||x=='}')
                {
                    if(sta.empty())
                    return false;
                    char y = sta.top();
                    sta.pop();
                    if((y=='('&&x==')')||(y=='['&&x==']')||(y=='{'&&x=='}'))
                    continue;
                    else return false;
                }
        }
        if(sta.empty())
            return true;
        return false;
    }
};

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

对于此问题,我们可以利用栈进行处理。我们遍历一边遍历字符串,一边进行处理,如果栈为空,直接将遍历到的字符放入到栈中。
如果栈顶元素与遍历的元素不同,就将遍历到的字符放入到栈中。
如果栈顶元素与遍历到的元素相同,就弹出栈顶元素,进行下一轮的遍历。
然而当遍历结束时,栈中所剩的元素会与我们要求序列相反,我们需要将此反转一边。

代码

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> sta;
        for(auto x:s)
        {
            if(sta.empty())
            {
                sta.push(x);
            }
            else{
                char y = sta.top();
                if(y==x)
                    sta.pop();
                else
                    sta.push(x);
            }
        }
        if(sta.empty())
        return {};
        string result;
        while(!sta.empty())
        {
            result+=sta.top();
            sta.pop();
        }
        reverse (result.begin(), result.end());
        return result;
    }
};

150. 逆波兰表达式求值

逆波兰表达式,即为后缀表达式,也就是说,每次遇到符号,就让符号前面前面两个数进行运算。
因此,我们可以构造一个栈,遍历这个字符串容器,遇到运算符,我们就让栈中的前两个元素进行运算,然后将产生的结果放入栈中。
如果遇到数字,我们就直接放入到栈中就好了。
最后返回这个数字就行,

代码

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> sta;
        for(auto x:tokens)
        {
            if(x!="+"&&x!="-"&&x!="*"&&x!="/")
                sta.push(stoll(x));
                else
                {
                    long long  a = sta.top();//后一个数
                    sta.pop();
                    long long  b = sta.top();
                    sta.pop();
                    if(x=="+") sta.push(b+a);
                    if(x=="-") sta.push(b-a);
                    if(x=="*") sta.push(b*a);
                    if(x=="/") sta.push(b/a);
                }
        }
        return int(sta.top());
    }
};

你可能感兴趣的:(C++,算法,leetcode,动态规划)