记录算法Day10

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

Leetcode 20.有效的括号

题目链接 20. 有效的括号
文章链接 https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html
视频链接 https://www.bilibili.com/video/BV1AF411w78g

思路

用栈做方便一些,因为栈方便记录上一个元素,当没遍历到‘}’、‘)‘、’]'时,将对应元素压入栈,遍历到时,判断栈顶元素是否与其相匹配,匹配就弹出栈,不匹配就压入栈,继续判断下一个。结束时,如果栈有元素,就说明有元素没有匹配到,返回false,否则返回true

代码


class Solution {

public:

    bool isValid(string s) {

        if (s.size() % 2 != 0) return false;

        stack<char> sta;

        int i=0;

        while(s[i]){
        
		//判断条件前提必须栈中有元素
		
            if(sta.size()){

                if((s[i]=='}'&&sta.top()=='{')||(s[i]==')'&&sta.top()=='(')||(s[i]==']'&&sta.top()=='[')){

                    sta.pop();

                    i++;

                    continue;

                }

            }

            sta.push(s[i]);
            
            i++;

        }

        if(!sta.size()){

            return true;

        }

        return false;

    }

};

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

题目链接 1047. 删除字符串中的所有相邻重复项
文章链接 https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html
视频链接 https://www.bilibili.com/video/BV12a411P7mw

思路

这道题和上道题很相似,只不过变成要输出不匹配的的元素,依然用栈来做。判断每次要压入栈的元素是否和上一个元素匹配,匹配就把上一个元素弹出,不匹配就把当前元素压入,等待下一个元素的匹配情况。注意输出的结果是倒序的,还要做一次反转,或者刚开始就反转再压入

代码

class Solution {

public:

    string removeDuplicates(string s) {

        stack<char> st;

        int cnt=0;

        int i=0;

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

        while(s[i]){

            if(!st.empty()&&s[i]==st.top()){

                //cout<<st.top();

                st.pop();

                cnt--;

                i++;

                continue;

            }

            st.push(s[i]);

            cnt++;

            //cout<<st.top();

            i++;

        }

        string res;

        res.resize(cnt);

        int j=0;

        while(!st.empty()){

            //cout<<st.top();

            res[j++] = st.top();

            //cout<<res[j];

            st.pop();

        }

        return res;

    }

};

Leetcode 150. 逆波兰表达式求值

题目链接 150. 逆波兰表达式求值
文章链接 https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html
视频链接 https://www.bilibili.com/video/BV1kd4y1o7on

思路

这道题就是去求后缀表达式,经典用栈解决的一道题。把数字压入,遇到运算符就弹出栈顶前两位,把每次计算的结果再压入栈,这道题注意要把字符串转换成数字压入或者计算

代码

class Solution {

public:

    int evalRPN(vector<string>& tokens) {

        int temp;

        stack<string> st;

        int result=0;
		//如果不是运算符则压入
        for(auto it=tokens.begin();it!=tokens.end();it++){

            if((*it!="/")&&(*it!="+")&&(*it!="-")&&(*it!="*")){

                st.push(*it);
		//是运算符就判断运算符类型
            }else{

                temp=stoi(st.top(),0,10);
		
                st.pop();

                result=stoi(st.top(),0,10);

                if(*it=="+"){

                    result+=temp;

                }else if(*it=="-"){

                    result-=temp;

                }else if(*it=="*"){

                    result*=temp;

                    //cout<<result<<endl;

                }else{

                    result/=temp;

                }

                st.pop();

                st.push(to_string(result));

            }

        }
		//结果要取此时的栈顶元素,否则会少输入只有一个字符串的情况
        result = stoi(st.top(),0,10);

        return result;

    }

};
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值