基于栈的括号匹配检查器(算法设计与实现C++)

一、目标概要

本文我们将实现一个基于栈的括号匹配检查器。这个算法不仅可以帮助我们理解栈的使用,还能让我们掌握如何处理字符串和基本的算法逻辑。

二、问题描述

给定一个字符串,其中包含各种括号 (, ), {, }, [, ],我们需要检查这些括号是否匹配。例如,{[()]} 是匹配的,而 {[(])} 是不匹配的。

三、算法思路

  1. 使用栈(Stack)来存储遇到的左括号。
  2. 遍历字符串中的每个字符:
    • 如果是左括号((, {, [),将其压入栈中。
    • 如果是右括号(), }, ]),检查栈顶元素是否与之匹配:
      • 如果匹配,弹出栈顶元素。
      • 如果不匹配,返回 false
  3. 遍历结束后,如果栈为空,说明所有括号都匹配;否则,返回 false

四、C++ 实现

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

using namespace std;

// 检查括号是否匹配的函数
bool isBalanced(const string& expression) {
    stack<char> s;

    for (char ch : expression) {
        // 如果是左括号,压入栈中
        if (ch == '(' || ch == '{' || ch == '[') {
            s.push(ch);
        }
        // 如果是右括号,检查是否匹配
        else if (ch == ')' || ch == '}' || ch == ']') {
            // 如果栈为空,说明没有匹配的左括号
            if (s.empty()) {
                return false;
            }
            // 获取栈顶元素
            char top = s.top();
            s.pop();
            // 检查是否匹配
            if ((ch == ')' && top != '(') ||
                (ch == '}' && top != '{') ||
                (ch == ']' && top != '[')) {
                return false;
            }
        }
    }

    // 如果栈为空,说明所有括号都匹配
    return s.empty();
}

int main() {
    string expression;
    cout << "请输入一个包含括号的表达式: ";
    cin >> expression;

    if (isBalanced(expression)) {
        cout << "括号匹配!" << endl;
    } else {
        cout << "括号不匹配!" << endl;
    }

    return 0;
}

五、代码解释

  1. stack<char> s;:我们使用 stack 来存储左括号。
  2. for (char ch : expression):遍历字符串中的每个字符。
  3. s.push(ch);:如果遇到左括号,将其压入栈中。
  4. if (s.empty()):如果遇到右括号时栈为空,说明没有匹配的左括号,返回 false
  5. char top = s.top(); s.pop();:获取栈顶元素并弹出。
  6. if ((ch == ')' && top != '(') || ...):检查右括号是否与栈顶的左括号匹配。
  7. return s.empty();:遍历结束后,如果栈为空,说明所有括号都匹配。

六、示例运行

请输入一个包含括号的表达式: {[()]}
括号匹配!

请输入一个包含括号的表达式: {[(])}
括号不匹配!

在这里插入图片描述

总结

这个算法通过使用栈这种数据结构,有效地解决了括号匹配的问题。栈的“后进先出”特性非常适合处理这种需要检查最近匹配的问题。通过这个例子,我们可以更好地理解栈的使用场景和基本操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值