括号匹配
给定一个只包括 (、)、[、]、{ 和 } 的字符串,判断字符串是否有效。有效字符串需满足左括号必须以正确的顺序用相同类型的右括号闭合。
判断括号的有效性可以使用栈来解决。通过遍历字符串,当遇到左括号时,会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此将这个左括号放入栈顶。当遇到右括号时,需要将一个相同类型的左括号闭合。此时可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是,或者栈中没有左括号,那么字符串无效。在遍历结束后,如果为空栈,说明字符串中的所有左括号闭合。
注意有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,可以直接判断出字符串无效,省去后续的遍历判断过程。
互动实验
括号侦探
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
C
bool is_valid_bracket(char *bracket) {
stack_t *stack = stack_create();
for (int i = 0; bracket[i] != '\0'; i++) {
char c = bracket[i];
if (c == '(' || c == '[' || c == '{') {
stack_push(stack, c);
} else {
if (stack_is_empty(stack)) {
return false;
}
char top = stack_pop(stack);
if (!((c == ')' && top == '(') || (c == ']' && top == '[') ||
(c == '}' && top == '{'))) {
return false;
}
}
}
bool valid = stack_is_empty(stack);
stack_destroy(stack);
return valid;
}