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

20. 有效的括号 

讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。 

这一个题就是将三种情况进行一个说明。 

题目链接:力扣

代码思路:首先判断字符串的长度,如果字符串的长度是奇数,可以知道明显是不符合题意的,此时直接return false;接下来进行遍历相应的字符串,判断三种场景,就是几种括号的情况进行相应的push操作;(2 3 情况)接下来找寻栈.top()和下面的不一样,直接return false/若栈为空了,也进行return false。(1 情况)最后就是进行return 栈是否为空。

class Solution {
public:
    bool isValid(string s) {

        //首先要进行判断奇数,如果要是奇数,直接返回false
        if(s.size()%2!=0)
        {
            return false;
        }

        //首先声明一个stack,用来存放对应的括号
        stack<char> panduan;

        for(int i = 0;i<s.size();i++)
        {
            if(s[i]=='(')
            {
                panduan.push(')');
            }
            else if(s[i]=='{')
            {
                panduan.push('}');
            }
            else if(s[i]=='[')
            {
                panduan.push(']');
            }

            else if(  panduan.empty()||s[i] != panduan.top() )//这个地方需要注意
            {
                return false;
            }

           else 
           {
               panduan.pop();
           }
        }
        return panduan.empty();
    }
};

1047. 删除字符串中的所有相邻重复项 --- 爱消除游戏

要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。

题目链接: 力扣

比如说如下所示:abbaca,删除重复项之后是c。

思路:首先是声明一个栈,用来存放字符串,询问尾部是否与现在的字符串相同。相同的话进行一个弹出。

class Solution {
public:
    string removeDuplicates(string s) {

        //这道题是比较简单的

        //首先声明一个栈,用来存放相应的字符
        stack<char> cun;

        for(int i = 0;i<s.size();i++)
        {
            if(cun.empty()||cun.top()!=s[i])
            {
                cun.push(s[i]);
            }
            else
            {
                cun.pop();
            }
        }

        string result="";//存放返回值

        while(!cun.empty())//这个地方是不能够使用for进行判断的
        {
            result+=cun.top();
            cun.pop();
        }

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

        return result;


    }
};

150. 逆波兰表达式求值

本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题

本题链接:力扣

class Solution {
public:
    int evalRPN(vector<string>& tokens) {

        //首先定义一个栈
        stack<long long> use;

        for(int i = 0;i<tokens.size();i++)
        {
            if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
            {
                long long k1 = use.top();
                use.pop();
                long long k2 = use.top();
                use.pop();
                if(tokens[i]=="-")
                {
                    use.push(k2-k1);
                }

                if(tokens[i]=="+")
                {
                    use.push(k2+k1);
                }

                if(tokens[i]=="*")
                {
                    use.push(k2*k1);
                }

                if(tokens[i]=="/")
                {
                    use.push(k2/k1);
                }
            }
            else
            {
                use.push(stoll(tokens[i]));//stoll 将string转换为long long类型
            }
        }
        int result = use.top();
        use.pop();

        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_47489229/article/details/131006246