20. Valid Parentheses

这道题225里写过欸。当时逻辑就比较混乱。

这是我的代码。哇打败了95.53%的人

#include <stack>
using std::stack;

class Solution {
public:
    bool isValid(string s) {
        stack<char> myStack;
        for(int i=0;i<s.length();i++){
            if(s[i]=='('||s[i]=='['||s[i]=='{'){
                myStack.push(s[i]);
            }
            else if(myStack.empty() && (s[i]==')'||s[i]==']'||s[i]=='}'))
                return false;
            else if(myStack.top()=='(' && s[i]==')')
                myStack.pop();
            else if(myStack.top()=='[' && s[i]==']')
                myStack.pop();
            else if(myStack.top()=='{' && s[i]=='}')
                myStack.pop();
            else
                return false;    
        }
        if(myStack.empty())
            return true;
        else 
            return false;
    }
};

有一个需要注意的点,如果我把代码里

            else if(myStack.empty() && (s[i]==')'||s[i]==']'||s[i]=='}'))
                return false;

这段给删掉的话,在我想象中这也应该能合并为最后的else{}那块。但是在实践中 若test case是"}",理应输出为false,而我的代码就是没有输出结果的。

这主要是因为 如果没有这段话,假设input是 } ,那么第一个条件  if(s[i]=='('||s[i]=='['||s[i]=='{') 不符合,进入第二个条件判断,也就是 else if(myStack.top()=='(' && s[i]==')')。但是此时我的stack是空的!对于空的stack运用top()命令会导致segfault。所以stack是空的两种情况一定要在最初就进行判断。

 

posted @ 2018-04-16 05:41  吹离了空白  阅读(89)  评论(0)    收藏  举报