描述
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例1:
示例2:
示例3:
示例4:
示例5:
解题思路
本题非常适合用栈(Stack)这种数据结构来求解。根据题意,我们发现如果是有效括号的话那么左右括号一定成对出现,并且括号中间的括号也可以成对。举个例子:“{[()]}”,最中间的是(),他们可以相互抵消,抵消以后的[]也可以抵消,最后最外面的{}也是成对的。
我们可以利用栈的特性,首先判断字符串是否为空,如果为空,返回true,如果不为空则遍历整个字符串,遇到左括号,入栈,遇到右括号,检查栈顶是否是左括号,如果是,那么就将栈顶出栈,右括号也不入栈,最后再判断栈是否为空。因为如果字符串的是合法的,那么最终栈为空,否则栈不为空。
总结起来,步骤如下:
- 判断字符串是否为空,空着返回true
- 遍历字符串
- 遇到左括号,压栈
- 遇到右括号:
- 当前栈为空,返回false
- 当前右括号对应的左括号与栈顶元素不想等,返回false
- 循环结束后判断栈是否为空,不为空返回false
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| typedef struct CharNode * PtrToCharNode;
struct CharNode{ char data[100000]; int top; };
typedef PtrToCharNode Stack;
bool push(Stack s,char x){ s->top++; s->data[s->top] =x ; return true; }
char pop(Stack s){ return (s->data[(s->top)--]); }
bool isValid(char* s) { Stack p = (Stack)malloc(sizeof(struct CharNode)); p->top = 0; if(strlen(s) == 0) return true; push(p, s[0]); for(int i=1; i<strlen(s); i++) { if(p->data[p->top] == '[') { if(s[i] == ']') pop(p); else push(p, s[i]); } else if(p->data[p->top] == '(') { if(s[i]==')') pop(p); else push(p, s[i]); } else if(p->data[p->top]=='{') { if(s[i]=='}') pop(p); else push(p,s[i]); } else push(p,s[i]); } if(p->top == 0) return true; else return false;
}
|