代码随想录:day11

使用C++语言

栈与队列part02

有效的括号
题意:判断字符串是否是有效括号的字符串,有效括号需满足:
1.左括号与相同的右括号匹配,并且每个右括号有对应的左括号
做法:利用栈的先进后出的特性, 括号如果以最里面的匹配括号分割,那么就符合栈的特性。
重点是遇见一个右括号就弹出栈, 左括号就压入栈, 遍历完字符串后,如果栈为空就是已经匹配上,不染就不是有效的括号。
核心代码

  for(auto it : s)
        {
            if(it == '(' || it == '{' || it == '[' )
            {
                st.push(it);
            }
            else{  // 要处理前面匹配成功和不能直接返回,而是要继续匹配直到遍历完数组或者,不能匹配的情况出现。
                if(st.empty())
                {
                    return false ; 
                }
                char t = st.top() ;
                cout<<t   ; 
                switch(t)
                {
                    case '('  :  
                    if( it != ')' ) // 只有在符合要求时才会进行下面的语句
                     return false   ; 
                     break; 
                    case '[' : 
                    if(it != ']')  
                    return false  ;
                    break ; 
                    case  '{' : 
                    if(it != '}') 
                    return false ; 
                    break ; 
                }         
                st.pop() ; 
            }
        }

全部代码

class Solution {
public:
    bool isValid(string s) {
        stack<char> st ;
        for(auto it : s)
        {
            if(it == '(' || it == '{' || it == '[' )
            {
                st.push(it);
            }
            else{  // 要处理前面匹配成功和不能直接返回,而是要继续匹配直到遍历完数组或者,不能匹配的情况出现。
                if(st.empty())
                {
                    return false ; 
                }
                char t = st.top() ;
                cout<<t   ; 
                switch(t)
                {
                    case '('  :  
                    if( it != ')' ) // 只有在符合要求时才会进行下面的语句
                     return false   ; 
                     break; 
                    case '[' : 
                    if(it != ']')  
                    return false  ;
                    break ; 
                    case  '{' : 
                    if(it != '}') 
                    return false ; 
                    break ; 
                }         
                st.pop() ; 
            }
        }
        if(st.empty())
        {
            return true  ;
        }

         return false ;
    }
};

删除字符串中的所有相邻重复项
不是一般的字符串去重, 而是针对栈的字符串去重。
实例:输入:“abbaca”
输出:“ca”

思路:遍历字符串,如果当前遍历元素与栈顶相同,栈顶出栈,如果不同就入栈。最后剩下栈的元素就是不同的元素。直接输出
核心代码

        for(auto it : s)
        {
            if(st.empty() || st.top() != it)
            {
                st.push(it) ;
            }
            else if(st.top() == it)
            {
                st.pop() ;

            }
        }

全部代码

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st ;
        for(auto it : s)
        {
            if(st.empty() || st.top() != it)
            {
                st.push(it) ;
            }
            else if(st.top() == it)
            {
                st.pop() ;

            }
        }
        vector<char> tmp ;
        string res ;  
        if(st.empty())
        {
            return res  ;
        }

        // int size_ = st.size() ;
        while(!st.empty())
        {
            char t   ; 
             t = st.top() ; 
        tmp.push_back(t) ;
        st.pop() ;
        }
        for(int it = tmp.size()- 1  ;  it >= 0 ; --it)
        {
            res+= tmp[it]  ; 
        }
        return res ; 
    }
};

逆波兰表达式
注意switch语句很难用, 面试时最好少使用代码又长又容易出错。 switch 和 case是一条语句, 不能在中间定义变量
题意,把逆波兰表达式的值计算出来
思路: 遇到数字就要加入栈,遇到运算符,先弹出两个操作数,先弹出的操作数作为右操作数, 计算后把值放入栈。 直到遍历完毕
注意: 对于负数由于前面有负号与减号一样,所以需要特判 ;
核心代码:

  for(auto it : tokens)
        {
            //负数要特判, debug的时候,要对不通过的实例,进行演绎。
            if((it[0] >= '0' && it[0]<= '9')  || (it[0] == '-' && it.size()>=2) )
            {
                int t = stoi(it) ;
                cout<<t ; 
                st.push(t) ; 
            }
            else
            {
        int r ,l, t ; 
                switch(it[0])// switch和case是一条语句
                {
                    case '+':
                     r= st.top()  ;
                    st.pop() ;
                     l = st.top()  ;
                    st.pop() ;
                    cout<<r << " "<< l ; 
                     t = l+r ;
                    st.push(t) ;
                    break ; 
                    
                    case '-':
                     r = st.top()  ;
                    st.pop() ;
                     l = st.top()   ;
                    st.pop() ;
                     t = l-r ;
                    st.push(t) ;
                    break ;  

                    case '*' :
                     r = st.top()  ;
                     cout<<"*" <<r ; 
                    st.pop() ;
                     l = st.top() ;
                     cout<<"*" <<l  ; 

                    st.pop() ;
                     t = l*r ;
                    st.push(t) ;
                    break ;    

                    case '/':
                     r = st.top()  ;
                    st.pop() ;
                     l = st.top()  ;
                    st.pop() ;
                     t = l/r ;
                    st.push(t) ;
                    break ;                                      
                }

            }

        }

完全代码:

class Solution {
public:
    int evalRPN(vector<string>& tokens) 
    {
        stack<int> st ; 
        for(auto it : tokens)
        {
            //负数要特判, debug的时候,要对不通过的实例,进行演绎。
            if((it[0] >= '0' && it[0]<= '9')  || (it[0] == '-' && it.size()>=2) )
            {
                int t = stoi(it) ;
                cout<<t ; 
                st.push(t) ; 
            }
            else
            {
        int r ,l, t ; 
                switch(it[0])// switch和case是一条语句
                {
                    case '+':
                     r= st.top()  ;
                    st.pop() ;
                     l = st.top()  ;
                    st.pop() ;
                    cout<<r << " "<< l ; 
                     t = l+r ;
                    st.push(t) ;
                    break ; 
                    
                    case '-':
                     r = st.top()  ;
                    st.pop() ;
                     l = st.top()   ;
                    st.pop() ;
                     t = l-r ;
                    st.push(t) ;
                    break ;  

                    case '*' :
                     r = st.top()  ;
                     cout<<"*" <<r ; 
                    st.pop() ;
                     l = st.top() ;
                     cout<<"*" <<l  ; 

                    st.pop() ;
                     t = l*r ;
                    st.push(t) ;
                    break ;    

                    case '/':
                     r = st.top()  ;
                    st.pop() ;
                     l = st.top()  ;
                    st.pop() ;
                     t = l/r ;
                    st.push(t) ;
                    break ;                                      
                }

            }

        }
        int res =st.top();
        // st.pop() ; 
        return res ; 
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值