原题:
题目描述
输入一个由()[]四种符号构成的字符串。判断其中的括号是否匹配,是,就输出yes,否则输出no。比如:输入“([])”、“([()])”、“[((()))]”、“()[][][]()[]”这几个字符串(双引号内部的内容),我们都算是匹配的。再比如:输入“([)”、“([)]”、“([(]))”这几个字符串,我们都认为是不匹配的。
输入
一个由()[]四种符号构成的字符串
输出
如果匹配,请输出yes,如果不匹配,请输出no
样例
样例输入 #1
([])
样例输出 #1
yes
样例输入 #2
[][()()(()()(())[]
样例输出 #2
no
样例输入 #3
([[([]
样例输出 #3
no
分析
这是一道涉及到栈(stack)的问题,具体什么是栈,请选择以个链接打开了解
首先,我们要获取输入,就暂时用std::string来存储一下输入数据。在核心部分用到栈,所以我们要定义一个。随后就是核心部分,从头遍历到脚趾尖!首先,判断遍历的字符s[i]是否是左括号,是的话就把左括号往栈里放,也就是stack::push(); 如果是右括号,那么判断是否匹配,匹配成功就抵消,也就是stack::pop(); 不成功呢?说明所有括号都匹配不了了,就可以结束了。可是,有一种特殊情况。可以看到,样例输入#3确实匹配了[],可是核心就结束了,所以还要在输出yes时留一手:在判断栈是不是空的。因为栈空就代表全部匹配成功了,否则不成功。
题解AC代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
stack<char> t;
for(int i=0; i<s.size(); i++) {
if(s[i]=='('||s[i]=='[')
{t.push(s[i]); }
else if(!t.empty()&&t.top()=='('&&s[i]==')')
{t.pop(); }
else if(!t.empty()&&t.top()=='['&&s[i]==']')
{t.pop(); }
else
{cout << "no"; return 0; }
}
cout << (t.empty()?"yes":"no");
return 0;
}
创作不yee~,点一个赞,咱们下期再见!