📜  平衡括号hackerrank解决方案c ++(1)

📅  最后修改于: 2023-12-03 15:09:46.809000             🧑  作者: Mango

平衡括号 Hackerrank 解决方案 C++

Hackerrank 上面的平衡括号问题是一个非常经典的括号匹配问题,需要在给定的字符串中判断是否每一个括号都有正确的匹配。在这篇文章中,我们将介绍如何使用 C++ 解决这个问题。

问题描述

给定一个由小括号 '(' 和 ')' 组成的字符串,编写一个函数来检查这个字符串中的括号是否匹配。空字符串也被视为匹配的字符串。

例如,字符串 "()()()" 和 "(())" 是匹配的,而字符串 "())" 不是。

解决方案

首先,让我们来看一下 Hackerrank 上面的平衡括号问题的具体要求:

给定一个由小括号 '(' 和 ')' 组成的字符串,编写一个函数 bool is_balanced(std::string expression) 来检查这个字符串中的括号是否匹配。空字符串也被视为匹配的字符串。

例如,字符串 "()()()" 和 "(())" 是匹配的,而字符串 "())" 不是。

我们可以使用堆栈来解决这个问题,具体思路如下:

遍历整个字符串,如果遇到左括号就将其压入堆栈中,如果遇到右括号就从堆栈中弹出一个元素。如果堆栈为空,表明这个右括号没有匹配的左括号,返回 false。如果遍历完了整个字符串,堆栈中还有剩余的左括号没有匹配的右括号,也返回 false。最后,如果遍历完整个字符串,堆栈为空,则说明所有的括号都有正确匹配,返回 true。

下面是详细的代码实现及注释,使用 C++11 实现。

#include <iostream>
#include <stack>
#include <string>

// 定义检查括号是否匹配的函数
bool is_balanced(std::string expression) {
    std::stack<char> s; // 用于存储左括号的堆栈
    for (char c : expression) {
        if (c == '(') { // 遇到左括号,压入堆栈
            s.push(c);
        } else if (c == ')') { // 遇到右括号,从堆栈中弹出
            if (s.empty()) { // 如果已经没有左括号了,表明没有匹配的左括号
                return false;
            }
            s.pop(); // 弹出一个左括号
        }
    }
    return s.empty(); // 如果遍历完整个字符串后,堆栈为空,则说明所有括号都有匹配
}

// 测试代码
int main() {
    // 测试用例,期望输出 true
    std::string expression1 = "()()()";
    std::cout << std::boolalpha << is_balanced(expression1) << std::endl;

    // 测试用例,期望输出 true
    std::string expression2 = "(())";
    std::cout << std::boolalpha << is_balanced(expression2) << std::endl;

    // 测试用例,期望输出 false
    std::string expression3 = "())";
    std::cout << std::boolalpha << is_balanced(expression3) << std::endl;

    return 0;
}

这个程序的输出结果应该是:

true
true
false
总结

这个问题只需要使用一个栈来判断左右括号是否匹配即可。遍历整个字符串,如果遇到左括号就将其压入堆栈中,如果遇到右括号就从堆栈中弹出一个元素。如果堆栈为空,表明这个右括号没有匹配的左括号,返回 false。如果遍历完了整个字符串,堆栈中还有剩余的左括号没有匹配的右括号,也返回 false。最后,如果遍历完整个字符串,堆栈为空,则说明所有的括号都有正确匹配,返回 true。

完整的代码片段已经在上面给出,使用时只需要将代码复制到编辑器中就可以了。