练习题(五)
时间限制: 1 Sec 内存限制: 128 MB
[命题人:171360140]
题目描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", “]”, “(”, “)”, “{”, “}” 六种字符
输出
输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
来源/分类
寒假练习赛
题目网址: http://47.112.31.182/problem.php?id=1069
题意:
本题就是判断括号是否匹配
思路:
这个题就是一个典型的栈的例题,运用后进先出的思想,遇到左括号时进栈,遇到右括号时与栈顶元素进行匹配,成功了出栈,判断下个元素。
代码:
#include <iostream>
#include <string> //string头文件
#include <stack> //stack栈的头文件
using namespace std;
int main()
{
string s;
stack<char> st; //创建一个栈
int n,i,f;
cin>>n;
while(n--)
{
f=1;
while(!st.empty()) //清空栈
{
st.pop(); //栈顶元素出栈
}
cin>>s; //输入字符串s
for(i=0;i<s.length();i++) //对字符串中的元素进行遍历
{
if(s[i]=='['||s[i]=='('||s[i]=='{') //左括号进栈
st.push(s[i]);
else
{
if(st.size()==0) //该元素为右括号且栈中元素为空
{
f=0; //标记
break; //结束循环
}
if((st.top()=='['&&s[i]==']')||(st.top()=='('&&s[i]==')')||(st.top()=='{'&&s[i]=='}')) //可以匹配
st.pop(); //栈顶出栈
else //不能匹配
{
f=0; //标记
break; //结束循环
}
}
}
if(f==0||!st.empty()) //标记为0或者栈中元素不为空(不能完全匹配)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
运行结果:
总结:
本题和前面那个括号匹配类似,只是多加一组大括号
括号匹配博客