原题链接:20.有效的括号
看到这种需要双双匹配的题目,就感觉可以使用栈来做
题目要求是:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。
还需要注意
栈为空的时候插入的是右括号的情况该怎么办?
如果栈里只有左元素没有右元素该怎么办?
匹配完后栈不为空怎么办?
注意好以上几点,配合上题目,利用栈就可以写出相关代码了
全代码:
class Solution {
public:bool isValid(string s) {stack<char> left;for(int i = 0; i < s.size(); i++){//遍历字符串 开始匹配if(s[i] == '(' || s[i] == '[' || s[i] == '{'){//往栈内存储左括号left.push(s[i]);}else if((s[i] == ')' || s[i] == ']' || s[i] == '}') && (!left.empty())){//1.栈不为空,插入的是右括号,则需要和存储左括号的栈进行匹配if((s[i] == ')' && left.top() == '(') && (!left.empty())){//栈里有匹配的左元素且栈不为空,那么代表有一对匹配的括号了,弹出栈顶元素,进入下一个s[i]判断left.pop();}else if((s[i] == ']' && left.top() == '[') && (!left.empty())){left.pop();}else if((s[i] == '}' && left.top() == '{') && (!left.empty())){left.pop();}else{//压入的右括号和左括号不匹配,又或者是压入右括号时栈为空,则返回falsereturn false;}}else{//2.栈为空,插入的是右括号,则代表不是按顺序闭合,直接返回falsereturn false;}}if(left.size() == 0){//到最后栈为空,则代表所有括号都进行了匹配,返回truereturn true;}//不为空,则代表没有全部进行匹配 返回falsereturn false;}
};