具体问题描述如下:
该问题是栈的最经典的应用
核心思想:
- 如果接收到左括号,进栈
- 如果接受到右括号,需要考虑两种情况
(1)]],像这种情况,压根儿就没有左括号,所以这个时候要判断栈是否为空,因为在这种情况下,是没有元素进栈的,此时为空栈
(2)看是否和栈顶的元素是一对儿的,如果是,则将栈顶元素出栈,否则就可以判断括号不匹配 - 当字符串中所有的字符都已经遍历过了,再判断栈是否为空,如果为空,说明所有的括号都有另一半的陪伴,两两结伴离去了,括号都是匹配的,如果不为空,说明左括号的个数比右括号的个数多,找不到伴儿的都留到栈里面了,像这种,[[[[[{}()
如果理解了上面的核心思想的话,读懂下面的代码应该不废劲
#include<bits/stdc++.h>
using namespace std;
string mark;
stack<char> s;
char pp(char c){
if(c==')') return '(';
if(c=='}') return '{';
if(c==']') return '[';
return '!';
}
bool PD(){
while(!s.empty())
s.pop();
for(int i=0;i<mark.length();i++){
if(mark[i]=='('||mark[i]=='{'||mark[i]=='[')
s.push(mark[i]);
else{
if(s.empty()||pp(mark[i]) !=s.top())
return false;
else
s.pop();
}
}
return s.empty();
}
int main(){
int n;
ios::sync_with_stdio;
cin>>n;
while(n--){
cin>>mark;
if(PD())
cout<<"Yes\n";
else
cout<<"No\n";
}
return 0;
}
加油 >_<