题目描述
现在,有一行括号序列,请你检查这行括号是否配对。
输入
第一行输入一个数N
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
[(])
(])
([])
样例输出
No
No
Yes
该题是一个不错的练习栈的操作
stack的成员函数
- void pop():弹出(即删除)栈顶元素
- T & top():返回栈顶元素的引用。通过此函数可以读取栈顶元素的值,也可以修改栈顶元素
- void push (const T & x):将 x 压入栈顶
主要思路
1、先以字符串的形式读入括号
2、遍历字符串
3、如果栈是空的就先将括号入栈
4、如果栈是空的将括号入栈
5、如果栈不空,判断a[j]是否可以与栈顶的元素配对,可以配对就弹出栈顶元素
注意
因为要循环判断多行,所以要判断一行的结束的时候要将栈清空
以下为代码
#include<iostream>//头文件
#include<stack>//栈的头文件
using namespace std;
int main()
{
int n,i,j;
cin>>n;
string a;//字符串
stack <char> stk;
for(i=0;i<n;++i)//用来判断多行
{
cin>>a;
int k=a.size();//k为字符串a的长度
for(j=0;j<k;++j)
{
if(stk.empty()) stk.push(a[j]);//栈为空,a[j]入栈
else if(stk.top()=='['&&a[j]==']')//栈不空且a[j]==']'
{
stk.pop();//出栈
}
else if(stk.top()=='('&&a[j]==')')//同上
{
stk.pop();
}
else stk.push(a[j]);
}
if(stk.empty()) cout<<"Yes"<<endl;//栈空则配对
else cout<<"No"<<endl;
while(!stk.empty()) stk.pop();//清空栈
}
}
如果有不懂可以评论。
让我们共同进步吧!