C++ 括号完整性判断:简单易懂的解释与示例代码

在某些情况下,需要判断一段字符串中括号是否完整,比如表达式或者代码片段。判断括号完整性的方法有很多,本文将介绍一种简单易懂的方法:使用字符串分割并借助栈来进行匹配。

为什么要使用字符串分割?

如果字符串中包含除了括号以外的其他字符,仅仅遍历每个字符进行判断可能会导致错误的结果。例如:

String str = "(a + b) * (c - d)";

如果仅仅遍历每个字符,可能会错误地认为 a + bc - 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;
}

代码解释

  1. 代码首先使用 std::vector<std::string> brackets 来存储字符串中的括号部分,并使用 std::stack<char> stack 作为辅助栈。
  2. 遍历字符串,将所有括号字符添加到 brackets 向量中。
  3. 遍历 brackets 向量,对于每个括号,如果它是左括号,则将其压入栈中;如果它是右括号,则判断栈是否为空,如果为空,则返回 false,否则弹出栈顶元素,并判断它是否与当前右括号匹配。如果匹配,继续遍历;如果不匹配,则返回 false
  4. 如果遍历完所有括号后,栈为空,则返回 true,表示括号完整。

总结

本文介绍了使用字符串分割和栈来判断括号完整性的方法,并提供了一个简单易懂的示例代码。希望这篇文章能够帮助你理解如何判断括号的完整性,并提供一种可行的方法。如果你还有任何问题,请随时提问。

C++ 括号完整性判断:简单易懂的解释与示例代码

原文地址: https://www.cveoy.top/t/topic/bO66 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录