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

20. 有效的括号

括号匹配三种错误情况:左右括号类型不匹配;右括号比左括号多,右括号会遇到空栈;左括号比右括号多,多的左括号会留在栈内。

class Solution {
public:
    stack<char> st;
    bool isValid(string s) {
        for(int i=0;i<s.size();++i)
        {
            if(s[i]=='('||s[i]=='['||s[i]=='{')
            {
                st.push(s[i]);
            }
            else if(s[i]==')'||s[i]==']'||s[i]=='}')
            {
                if(st.empty())return false;//右括号遇空栈
                char c=st.top();
                cout<<c<<endl;
                switch (c)
                {
                    case '(':
                        if(s[i]!=')')return false; //不匹配
                        break;
                    case '[':
                        if(s[i]!=']')return false;
                        break;
                    case '{':
                        if(s[i]!='}')return false;
                        break;
                }
                st.pop();
            }
        }
        if(!st.empty())return false; //最后还有左括号剩在栈里面
        return true;
    }
};

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

遍历字符串,如果栈为空,就把第一个s[0]入栈,否则就跟栈顶元素作比较,如果一样就出栈,如果不一样就把这个元素入栈。

150. 逆波兰表达式求值

用后缀表达式求结果,之前知道用一个符号栈加一个操作数栈。

string转数字用一个函数:stoll。记住类型转化不要自己写函数了。

一开始我用if判断数字,还忘记负数的第一个字符是-,加了之后

if((tokens[i][0]>='0'&&tokens[i][0]<='9')||(tokens[i][0]=='-'))
            {
                ss.push(stoll(tokens[i]));
            }
            else//符号
            {}

减法就会被误当做负数,所以还是在if里面判断+-*/字符串更方便。

if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
            {
                if(ss.size()<2)return ss.top();
                long long c1=ss.top();
                ss.pop();
                long long c2=ss.top();
                ss.pop();
                char ch=tokens[i][0];
                switch(ch)
                {
                    case '*':
                        ss.push(c1*c2);
                        break;
                    case '+':
                        ss.push(c1+c2);
                        break;
                    case '-':
                        ss.push(c2-c1);
                        break;
                    case '/':
                        ss.push((long long)(c2/c1));
                        break;
                    default:
                        break;
                }
                
            }
            else//符号
            {
                ss.push(stoll(tokens[i]));
            }

注意数得用long long类型。

还有除法和减法的被减数和被除数得是次栈顶不是栈顶!

虽然简单,但是自己要注意的点还挺多的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值