版权声明:本文为博主原创文章,未经允许不得转载。 https://blog.csdn.net/darkrabbit/article/details/89409611
编程基础 - 栈的应用 - 括号匹配问题(Bracket Matching)
文章目录
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})
检测结果:括号匹配