括号匹配
题目
在编程当中我们只会用到三种括号:圆括号(),方括号[]和花括号{},编译器在编译的时候会检查括号是否正确匹配。例如{[()]}、{()[]{}}都是合法的匹配。但是([)]则是不合法的匹配。请编写一个程序来判断输入的括号序列是否合法。
输入
测试数据由多组,每组数据有一行,为( ) [ ] { }组成的序列,长度不超过1000
输出
对于每组数据输出一行,如果是合法匹配则输出YES,不合法则输出NO,请注意大小写
样例输入
{([()]{})}
样例输出
YES
思路小导
本题也是解法众多,但是万变不离其中,无论如何我们要用到的都是栈的相关知识,在你不懂如何使用栈,修改栈中元素时,不管C语言还是C++都可以直接使用数组在作为基底,对出栈和进栈等等操作(push(),pop(),empty()…)分别写一个函数,在主函数中调用使用即可,此处我们直接使用栈来实现,来复习练习栈的使用。
代码流程
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
bool ok(string &s) {//写一个判断括号匹配合法的函数
stack<char> S;//定义字符栈
for (auto c:s) {//auto循环方便遍历
if (c == '(' || c == '[' || c == '{')S.push(c);//如果是左括号就进栈
if (c == ')') {//如果是右括号
if (S.empty() || S.top() != '(')return false;//先过滤掉栈为空和栈顶不为相应左括号的情况
S.pop();//再移出栈
}
if (c == ']') {
if (S.empty() || S.top() != '[')return false;
S.pop();
}
if (c == '}') {
if (S.empty() || S.top() != '{')return false;
S.pop();
}
}
return S.empty();//返回栈为空
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
for(string s;cin>>s;){//循环输入字符串,题目要求多组输入,若给出固定组数,再循环前定义输入即可
if (ok(s)) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}
小结
1.本题首先要知道哪些条件才可以判断合法的匹配
2.然后理好思绪每一步要实现的内容
3.正确使用栈
4.操作过程中倘若有误,一定要多测试,实践出真知,有时可以用cerr代替cout来输出表示测试的数据。