Codeforces上有一道我曾经讲过的题,买看过的小伙伴看这个链接:
https://blog.csdn.net/ericgipsy/article/details/79980874
然后再来一道题:
http://www.fjutacm.com/Problem.jsp?pid=1922
这道题和上一题差不多,它只需要判断匹配与否即可,但是要开多组,所以要加一步清空操作:
while(!sta.empty()) sta.pop();
本人AC代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <stack>
#include <algorithm>
using namespace std;
const int Maxx = 2e6 + 7;
char s[Maxx];
int ans;
stack <char> sta;
int main() {
while(~scanf("%s", s)) {
int l = 0, r = 0;
bool flg = 1;
int ln = strlen(s);
for(int i = 0; i < ln; i++) {
if(s[i] == '<' || s[i] == '(' || s[i] == '[' || s[i] == '{') {
l++;
sta.push(s[i]);
}
else if(s[i] == '>') {
r++;
if(sta.empty()) {
flg = 0;
break;
}
if(sta.top() == '<') sta.pop();
else {
flg = 0; break;
}
}
else if(s[i] == ')') {
r++;
if(sta.empty()) {
flg = 0;
break;
}
if(sta.top() == '(') sta.pop();
else {
flg = 0; break;
}
}
else if(s[i] == ']') {
r++;
if(sta.empty()) {
flg = 0;
break;
}
if(sta.top() == '[') sta.pop();
else {
flg = 0; break;
}
}
else if(s[i] == '}') {
r++;
if(sta.empty()) {
flg = 0;
break;
}
if(sta.top() == '{') sta.pop(); //匹配后出栈
else {
flg = 0; break;
}
}
}
while(!sta.empty()) sta.pop();
if(l != r) flg = 0;
if(flg) puts("YES");
else puts("NO");
}
return 0;
}