题目由来 : 1486 - 括号匹配-东方博宜OJ
注 ^(* ̄(oo) ̄)^:一定要认真思考完解析再将代码复制哦~
旺 U•ェ•*U : 有不明白的地方发在评论区
制作不易,点个赞再看呗~o((⊙﹏⊙))o
题目描述:
输入一个由()[]
四种符号构成的 字符串。判断其中的括号是否匹配,
是,就输出yes
,否则输出no
。
比如:输入([])
、([()])
、[((()))]
、()[][][]()[]
这几个字符串(双引号内部的内容),
我们都算是匹配的。
再比如:输入([)
、([)]
、([(]))
这几个字符串,我们都认为是不匹配的。
输入:
一个由()[]
四种符号构成的字符串,字符串长度不超过 100100 。
输出:
如果匹配,请输出yes
,如果不匹配,请输出no
。
样例:
输入 ([])
输出 yes
代码[解答]+[解析完整]:
#include<bits/stdc++.h>
using namespace std;
string s;
stack<char> n;
int main()
{
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='('||s[i]=='[')//1.先判断输入的是否为'('或'['
{
n.push(s[i]);//2.将括号入栈
}
else if(n.empty()==0&&n.top()=='('&&s[i]==')')
{ //3.else if判断栈的顶部元素是否为'(',再看下一个元素是否为')'如果是就说明匹配
n.pop();//4.括号是匹配的,就将栈清空[删除元素]
}
else if(n.empty()==0&&n.top()=='['&&s[i]==']')
{ //同第3注释一样,判断的是'[ ]'括号
n.pop();//跟第4注释同理
}
else //5.如果输入的括号都不符合就为不匹配,输出'no'
{
cout<<"no";
return 0;//直接返回0,不继续执行接下来的代码
}
}
//**empty():判断栈是否为空 (空输出1,不是空输出0)
if(n.empty()==1) //最后一步,判断栈是否为空,如果为空说明输入的整个字符[括号]匹配
{
cout<<"yes";
}
else //栈不为空说明其中有的括号不匹配
{
cout<<"no";
}
return 0; //结束啦(*^▽^*)
}