C++ 括号完整性判断:简单易懂的解释与示例代码
C++ 括号完整性判断:简单易懂的解释与示例代码
在某些情况下,需要判断一段字符串中括号是否完整,比如表达式或者代码片段。判断括号完整性的方法有很多,本文将介绍一种简单易懂的方法:使用字符串分割并借助栈来进行匹配。
为什么要使用字符串分割?
如果字符串中包含除了括号以外的其他字符,仅仅遍历每个字符进行判断可能会导致错误的结果。例如:
String str = "(a + b) * (c - d)";
如果仅仅遍历每个字符,可能会错误地认为 a + b 和 c - d 中的括号是不完整的。为了避免这种情况,可以使用字符串分割的方法,将字符串中的括号部分提取出来,然后再进行判断。
示例代码
以下是一个简单的示例代码,演示了如何使用字符串分割来判断括号的完整性:
#include <iostream>
#include <stack>
#include <string>
#include <vector>
bool isBalanced(const std::string& str) {
std::vector<std::string> brackets; // 存储括号部分的向量
std::stack<char> stack; // 辅助栈
// 遍历字符串,将括号部分添加到向量中
for (char c : str) {
if (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') {
brackets.push_back(std::string(1, c));
}
}
// 遍历向量中的每个括号进行判断
for (const std::string& bracket : brackets) {
if (bracket == '(' || bracket == '[' || bracket == '{') {
stack.push(bracket[0]); // 左括号入栈
} else if (bracket == ')' || bracket == ']' || bracket == '}') {
if (stack.empty()) {
return false; // 栈为空,右括号没有对应的左括号
}
char top = stack.top();
stack.pop();
// 判断右括号是否与栈顶的左括号匹配
if ((bracket == ')' && top != '(') || (bracket == ']' && top != '[') || (bracket == '}' && top != '{')) {
return false; // 括号不匹配
}
}
}
return stack.empty(); // 如果栈为空,说明括号完整
}
int main() {
std::string str = "([{}])";
bool balanced = isBalanced(str);
std::cout << "Is the string balanced? " << (balanced ? "Yes" : "No") << std::endl;
return 0;
}
代码解释
- 代码首先使用
std::vector<std::string> brackets来存储字符串中的括号部分,并使用std::stack<char> stack作为辅助栈。 - 遍历字符串,将所有括号字符添加到
brackets向量中。 - 遍历
brackets向量,对于每个括号,如果它是左括号,则将其压入栈中;如果它是右括号,则判断栈是否为空,如果为空,则返回false,否则弹出栈顶元素,并判断它是否与当前右括号匹配。如果匹配,继续遍历;如果不匹配,则返回false。 - 如果遍历完所有括号后,栈为空,则返回
true,表示括号完整。
总结
本文介绍了使用字符串分割和栈来判断括号完整性的方法,并提供了一个简单易懂的示例代码。希望这篇文章能够帮助你理解如何判断括号的完整性,并提供一种可行的方法。如果你还有任何问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/bO66 著作权归作者所有。请勿转载和采集!