大家好,我是怒码少年小码。
本篇我们来详细解答一个栈的经典题目——括号匹配。
括号匹配问题
LeetCode20:给定一个只包括‘(’‘)’,‘{’‘}’,‘[’‘]’
的字符串s,判断字符串是否有效。有效的满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合
示例1:
- 输入:s = “()[]{}”
- 输出:true
示例2:
- 输入:s = “(]”
- 输出:false
这题你会怎么做?🤔我这里使用栈的方法来的:
char pairs(char a) {
if (a == '}')return '{';
if (a == ']')return '[';
if (a == ')')return '(';
return 0;
}
这个函数pairs()
用于判断一个字符与其对应的左括号字符是否匹配。
//接受一个字符数组指针s作为输入。
bool isValid(char* s) {
//获取字符串的长度
int n = strlen(s);
//判断长度是否合法
if (n % 2 == 1) {
return false;
}
char* stk = new char[n + 1];
int top = 0;
for (int i = 0; i < n; i++) {
char ch = pairs(s[i]);
if (ch) {
if (top == 0 || stk[top - 1] != ch) {
delete[] stk; // 释放动态分配的内存
return false;
}
top--;
}
else {
stk[top++] = s[i];
}
}
delete[] stk; // 释放动态分配的内存
return top == 0;
}
首先,通过使用strlen()
函数来获取输入字符串s的长度,将其存储在变量n中。如果字符串长度是奇数,那么它肯定是无效的。
PS:使用
strlen();
必须引入头文件<cstring>
,例如:#include <cstring>
。
其次,char* stk = new char[n + 1];
这段代码意味着我们使用动态内存分配(new)来创建一个 char 类型的动态数组,并将指向这个动态数组的指针赋给名为 stk 的指针变量。n + 1
是为了在字符数组的末尾容纳一个终止字符 ‘\0’。
对于每个字符s[i]
,函数调用pairs()
函数,将返回的左括号字符存储在变量ch中。
- 如果
ch
非零,则说明s[i]
是一个右括号字符。接下来,将检查栈是否为空且栈顶字符与ch
是否匹配。如果不匹配,或者栈为空,则表示括号字符串是无效的。在这种情况下,函数释放动态分配的内存(使用delete[]
),并返回false
。 - 如果
ch
为零,则说明s[i]
是一个左括号字符。在这种情况下,将其推入栈中,并将top增加1。
最后,函数再次使用delete[]释放动态分配的内存,以避免内存泄漏。
好了,写一段代码测试一下吧:
int main() {
char s[] = "{[()]}";
bool result = isValid(s);
cout << result << endl;
return 0;
}
输出的是数字1。
在C++中,布尔变量的值在输出时会以整数形式显示,即1表示true,0表示false。如果你想要将布尔变量以true
和false
的形式输出,你可以使用标准库<boolalpha>
的std::boolalpha
来改变显示方式。