Leetcode复习: 堆和栈

堆和栈应该在面试的时候会经常考吧。赶紧把做过的堆和栈的题重新复习下

Valid Parentheses

         https://leetcode.com/problems/valid-parentheses/

         这个题的思路是这样的:

         如果只有一种括号的话,那么可以考虑 +1-1法,即遇到左括号就加1,遇到右括号就-1。如果这个值出现为负的话,则明显不成立。而现在是三种括号类型,这种方法是行不通的。因为是堆和栈专题,很自然的想到用栈来解决。因为右括号必须要和栈顶的左括号匹配上才可以。很棒的方法。想到了,高兴!

         中间出了一个bug。是因为考虑不周的原因。就是你每次判断栈顶值之前都要判断,栈是否为空。为空的时候,无法取值。在这个地方犯了个错误。

   

class Solution {
public:
    bool isValid(string s) {
        
        if(s=="")
            return true;
        
        int length = s.length();
        
        if(length % 2 != 0)
            return false;
            
        stack<char> sta_int; //一开始char居然写成了int了,不过leetcode居然没报错。不过想想,也是啊,不会报错。
        
        for(int i = 0; i < length; i++)
        {
            if(s[i] == '(' || s[i] == '[' || s[i] == '{')
            {
                sta_int.push(s[i]);
            }
            else
            {
                if( sta_int.size() == 0)
                
                    return false;
                    
                if(sta_int.top()=='(' && s[i] == ')')
                    sta_int.pop();
                
                else if(sta_int.top()=='[' && s[i] == ']') // 这里的时候一开始没弄对。上面pop完了之后到这里就可能为空了,第一遍的时候没考虑到。
                    sta_int.pop();
                
                else if(sta_int.top()=='{' && s[i] == '}')
                    sta_int.pop();
            }
        }
        
        if(sta_int.size() == 0)
            return true;
        else
            return false;
    }
};

 

            学习答案

         变量名定义为stk会很帅。

posted @ 2015-08-26 21:01  程序员小王  阅读(487)  评论(0编辑  收藏  举报