描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0 < N <= 100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“,”]”,”(“,”)”四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([])
样例输出
No
No
Yes
算法思路:将字符串放在栈中,遇到匹配的将其弹出去,遇到不匹配的就退出循环。将其匹配和不匹配的记录,然后将其打印。
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
#include <stack>
using namespace std;
int judge[10000];
char kuohao[10000];
stack<char> s[100];
int main()
{
int N;
int j = 0;
cin >> N;
for(int i = 0; i < N ; i++)
{
cin >> kuohao;
s[i].push('e');
if(kuohao[j] != '(' && kuohao[j] != ')' && kuohao[j] != '[' && kuohao[j] != ']')
{
memset(kuohao,0,sizeof(kuohao));
judge[i] = 0;
j = 0;
continue;
}
while(kuohao[j] == '(' || kuohao[j] == ')' || kuohao[j] == '[' || kuohao[j] == ']')
{
if(kuohao[j] == '(' || kuohao[j] == '[')
{
s[i].push(kuohao[j]);
}
if(kuohao[j] == ')')
{
if(s[i].top() == '(') s[i].pop();
else s[i].push(kuohao[j]);
}
if(kuohao[j] == ']')
{
if(s[i].top() == '[') s[i].pop();
else s[i].push(kuohao[j]);
}
j++;
}
memset(kuohao,0,sizeof(kuohao));
if(s[i].top() == 'e') judge[i] = 1;
j = 0;
}
for(int i = 0; i < N ; i++)
{
if(judge[i]) cout << "Yes" <<endl;
else cout << "No" << endl;
}
}
优化代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
vector<char> vec;
string ch;
vec.push_back(' ');
cin>>ch;
for(int i=0;i<ch.length();i++)
{
vec.push_back(ch[i]);
if( vec.back()-1 == *(vec.end()-2) || vec.back()-2 == *(vec.end()-2))
{
vec.pop_back();
vec.pop_back();
}
}
if(vec.size()==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}

本文介绍了一种使用栈来检查括号序列是否正确配对的方法。通过遍历输入字符串,并利用栈来跟踪左括号,当遇到右括号时检查是否与栈顶元素匹配并弹出。最终若栈为空,则说明括号全部正确配对。
566

被折叠的 条评论
为什么被折叠?



