栈的应用——括号匹配(C++实现)
实现代码
#include<bits/stdc++.h>
using namespace std;
bool match(string str) {
stack<char> s;
for (int i = 0; i < str.length(); i++) {
if (str[i] == '(' || str[i] == '[') {
s.push(str[i]);
} else if (str[i] == ')') {
if(!s.empty() && s.top() == '(') {
s.pop();
}
else{
return false;
}
} else if (str[i] == ']') {
if(!s.empty() && s.top() == '[') {
s.pop();
}
else{
return false;
}
}
}
return s.empty() ? true : false;
}
int main(int argc, char const *argv[])
{
string str;
while(cin >> str) {
printf("%s\n", match(str) ? "YES" : "NO");
}
return 0;
}
算法思路
- 本算法忽略所有的非括号元素,遍历表达式字符串,遇到左括号,则压栈,遇到一个右括号就弹栈,判断弹出的栈顶元素是否能与当前右括号匹配,若能,则继续遍历表达式直到遍历结束,否则,返回错误值,括号匹配不正确。遍历结束后,若栈空,则表达式括号都匹配正确输出NO,否则表达式中的括号不匹配则输出NO。
- 问题规模n下,本算法时空复杂度均为O(n)。
测试数据
(9+9)+(10+123123)+[(9+0)+(9+89)]+[(9+0)]
(9+9)+(10+123123)+[(9+0)+(9+89)]+[(9+0)]([][][])[[[[[()()]]]]]
(9+9)+(10+123123)+[(9+0)+(9+89)]+[(9+0)]([][][])[[[[[()()]]])]]
(9+9)+(10+123123)+[(9+0)+(9+89)]+[(9+0)]([][][])[[([[[()()]]])]]
- 注意:输入数据中间不能有空格,否则会导致cin读取字符串时字符串被截断,从而导致意想不到的结果
输出结果
YES
YES
NO
YES
最后
- 本算法为简单的栈应用
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!