一、目标概要
本文我们将实现一个基于栈的括号匹配检查器。这个算法不仅可以帮助我们理解栈的使用,还能让我们掌握如何处理字符串和基本的算法逻辑。
二、问题描述
给定一个字符串,其中包含各种括号 (
, )
, {
, }
, [
, ]
,我们需要检查这些括号是否匹配。例如,{[()]}
是匹配的,而 {[(])}
是不匹配的。
三、算法思路
- 使用栈(Stack)来存储遇到的左括号。
- 遍历字符串中的每个字符:
- 如果是左括号(
(
,{
,[
),将其压入栈中。 - 如果是右括号(
)
,}
,]
),检查栈顶元素是否与之匹配:- 如果匹配,弹出栈顶元素。
- 如果不匹配,返回
false
。
- 如果是左括号(
- 遍历结束后,如果栈为空,说明所有括号都匹配;否则,返回
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;
}
五、代码解释
stack<char> s;
:我们使用stack
来存储左括号。for (char ch : expression)
:遍历字符串中的每个字符。s.push(ch);
:如果遇到左括号,将其压入栈中。if (s.empty())
:如果遇到右括号时栈为空,说明没有匹配的左括号,返回false
。char top = s.top(); s.pop();
:获取栈顶元素并弹出。if ((ch == ')' && top != '(') || ...)
:检查右括号是否与栈顶的左括号匹配。return s.empty();
:遍历结束后,如果栈为空,说明所有括号都匹配。
六、示例运行
请输入一个包含括号的表达式: {[()]}
括号匹配!
请输入一个包含括号的表达式: {[(])}
括号不匹配!
总结
这个算法通过使用栈这种数据结构,有效地解决了括号匹配的问题。栈的“后进先出”特性非常适合处理这种需要检查最近匹配的问题。通过这个例子,我们可以更好地理解栈的使用场景和基本操作。