力扣20 有效的括号
题目
输出示例
基本思路
首先做这个题的时候我知道要用栈实现,但是因为对题目和对栈的理解并不是很清楚,所以思路就不是很清楚。
- 做这个题时首先是要明确栈的后进先出的特点
- 然后是要明确括号不匹配的几种情况,a)左括号多;b)右括号多; c)左右括号不匹配
- 还要明确的是如果字符串的总个数是奇数个,一定不成功
代码的基本思路
首先要写一个get_char函数进行手动的映射,就是如果遍历的是右括号,返回的就是左括号,如果遍历的是左括号,返回的就是0;然后就进行主函数的功能实现,先计算字符串的长度,如果是奇数个,就直接返回false;然后定义一个数组,用于表示栈,定义变量top用于指向数组中的位置。接着进行遍历字符串,在里面进行if语句的判断。定义ch表示get_char函数的返回值(左括号),如果当前遍历的是左括号,则返回的是0,即ch=0,则直接就入栈,如果ch不等于0,即ch表示的是左括号,则此时遍历的是右括号,则要比较栈顶的元素是否和ch相等,相等就表示匹配,不相等就不匹配,表示的就是c中情况;还有,如果此时的栈已经为空了,就是此时字符串还没遍历完,但是栈已经为空了,说明此时右括号多。还有左括号的多的情况,就是字符串遍历结束之后,栈中还有元素,此时就只需要判断top是否等于0即可。
代码实现
char pairs(char a) {
//如果是遍历到的是右括号,返回的是左括号
//如果遍历到的是左括号,返回的就是0
if (a == '}') return '{';
if (a == ']') return '[';
if (a == ')') return '(';
return 0;
}
bool isValid(char* s) {
int n = strlen(s);
//计算字符串的长度,如果是奇数个,就一定不匹配
if (n % 2 == 1) {
return false;
}
//定义一个数组,表示栈
int stk[n + 1], top = 0;
//遍历字符串
for (int i = 0; i < n; i++) {
//ch表示的是左括号,如果此时遍历的是左括号,在pairs中并没有相应的匹配,
//所以返回的就是0,if语句就不会执行,所以会直接入栈,入栈的是左括号
char ch = pairs(s[i]);
if (ch) {
//如果此时ch表示的是左括号,然后判断栈内是否为空或者栈顶元素是否等于ch
//栈为空,表示字符串还没遍历完,栈就为空了,表示字符串中的括号数量不匹配
//字符串中右括号多,如果栈顶元素与ch不相等,表示括号不匹配
if (top == 0 || stk[top - 1] != ch) {
return false;
}
//出栈
top--;
} else {
//入栈
stk[top++] = s[i];
}
}
//还有一种是左括号多了偶数个,栈内还有元素,此时top是不为0的,所以返回的是false
return top == 0;
}