编程基础 - 栈的应用 - 括号匹配问题(Bracket Matching)

版权声明:本文为博主原创文章,未经允许不得转载。 https://blog.csdn.net/darkrabbit/article/details/89409611

编程基础 - 栈的应用 - 括号匹配问题(Bracket Matching)

返回分类:全部文章 >> 基础知识

返回上级:编程基础 - 栈(Stack)



1 括号匹配简述

所谓括号匹配,可以延伸出许多匹配问题,不限于括号。只要是两个字符就可以设置成匹配关系。

常见的匹配关系:(), [], {}, ##, "", '', &&

我们这里就三种括号(()[]{})的匹配来进行编写。

在对元素依次进栈过程中,过程可以描述为:

  • 遇到左括号,左括号进栈

  • 遇到右括号,对比栈顶是否为对应的左括号

    • 栈顶为空:输入不合法
    • 栈顶为对应的左括号:左括号出栈
    • 栈顶为非对应的左括号:输入不合法
  • 当所有元素都检查完毕时,如果栈内还有元素(左括号数量多余右括号),说明输入依然不合法。


2 括号匹配(C++ Code)

2.1 头文件main.h

#pragma once

#include <string> // 字符串
#include <stack> // 栈
#include <unordered_map> // 字典

2.2 主函数文件main.cpp

首先是检测函数:

// 匹配括号
// params:
//      input:      输入字符串
//      right2Left: 右括号到左括号的映射
bool MatchBracket(string input, unordered_map<char, char> right2Left)
{
    if (input.length() == 0)
    {
        return true;
    }

    stack<char> leftBrakets; // 定义左括号栈
    
    for (int i = 0; i < input.length(); i++)
    {
        char ch = input[i];

        // 如果是左括号
        if (ch == '(' || ch == '[' || ch == '{')
        {
            leftBrakets.push(ch); // 入栈
            continue;
        }

        // 如果是右括号
        if (right2Left.find(ch) != right2Left.end())
        {
            // 如果栈为空,或者与栈顶左括号不匹配
            if (leftBrakets.empty() || leftBrakets.top() != right2Left[ch])
            {
                return false; // 不合法
            }

            leftBrakets.pop(); // 左括号出栈
            continue;
        }
    }

    return leftBrakets.empty(); // 如果不为空,则左括号多,不合法
}

然后是主函数

#include "main.h"

#include <iostream>
using namespace std;

bool MatchBracket(string input, unordered_map<char, char> right2Left);

int main()
{
    // 初始化右括号到左括号的映射
    unordered_map<char, char> right2Left;
    right2Left[')'] = '(';
    right2Left[']'] = '[';
    right2Left['}'] = '{';

    string input;
    while (true)
    {
        cout << "括号匹配,输入一个字符串:";
        cin >> input;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        // 检测括号匹配
        bool match = MatchBracket(input, right2Left); 

        // 打印结果
        cout << "检测结果:" << (match ? "括号匹配" : "括号不匹配") << endl;

        cout << endl;
    }


    system("pause");
    return 0;
}

2.3 输出结果

括号匹配,输入一个字符串:asdads(asda)asda(asda(asd))asd[asd]
检测结果:括号匹配

括号匹配,输入一个字符串:(()]
检测结果:括号不匹配

括号匹配,输入一个字符串:((()))[
检测结果:括号不匹配

括号匹配,输入一个字符串:[(])
检测结果:括号不匹配

括号匹配,输入一个字符串:{dasda}{asd[s]}(sad{asd})
检测结果:括号匹配

猜你喜欢

转载自blog.csdn.net/darkrabbit/article/details/89409611