堆和栈应该在面试的时候会经常考吧。赶紧把做过的堆和栈的题重新复习下
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会很帅。