0
已解决
陈曦
资深天翼
资深天翼
#include<iostream>
#include<stack>
#include<string>
using namespace std;
string s;
stack<char>a;
int n;
int main(){
cin>>n;
while(n--){
int f=0;
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='{'||s[i]=='['||s[i]=='(')
a.push(s[i]);
if(s[i]==')'){
if(!a.empty()&&a.top()=='('){
a.pop();
}
else{
cout<<"NO\n";
f=1;
break;
}
}
else if(s[i]==']'){
if(!a.empty()&&a.top()=='['){
a.pop();
}
else{
f=1;
cout<<"NO\n";
break;
}
}
else if(s[i]=='}'){
if(!a.empty()&&a.top()=='{'){
a.pop();
}
else{
cout<<"NO\n";
f=1;
break;
}
}
}
if(n==0) continue;
if(f==0){
if(!a.empty())
cout<<"NO\n";
else
cout<<"YES\n";
}
// cout<<"n的值为:"<<n<<endl;
while(!a.empty()) a.pop();
}
return 0;
}
20分 啊啊啊
陈曦在2021-08-03 12:47:08追加了内容
现在40
#include<iostream>
#include<stack>
#include<string>
using namespace std;
string s;
stack<char>a;
int n;
int main(){
cin>>n;
while(n--){
int f=0;
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='{'||s[i]=='['||s[i]=='(')
a.push(s[i]);
if(s[i]==')'){
if(!a.empty()&&a.top()=='('){
a.pop();
}
else{
cout<<"NO\n";
f=1;
break;
}
}
else if(s[i]==']'){
if(!a.empty()&&a.top()=='['){
a.pop();
}
else{
f=1;
cout<<"NO\n";
break;
}
}
else if(s[i]=='}'){
if(!a.empty()&&a.top()=='{'){
a.pop();
}
else{
cout<<"NO\n";
f=1;
break;
}
}
}
// if(n==0) continue;
if(f==0){
if(!a.empty())
cout<<"NO\n";
else
cout<<"YES\n";
}
// cout<<"n的值为:"<<n<<endl;
while(!a.empty()) a.pop();
}
return 0;
}
0
已采纳
宣海宁
中级光能
中级光能
以“同上”的思路,我们来做一个优先级的映射
#include<iostream>
#include<stack>
using namespace std;
string s;
int n,a[130];
bool check(string s)
{
stack<char> t;
……
}
int main ()
{
a['<']=4;
a['(']=3;
a['[']=2;
a['{']=1;
cin>>n;
while(n--)
{
cin>>s;
if(check(s)) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}
其他代码可看得懂?
然后遍历s字符串,判断左括号的情况。
if(s[i]=='<' || s[i]=='(' || s[i]=='[' || s[i]=='{')
{
if(t.empty() || a[s[i]]>=a[t.top()])
{
t.push(s[i]);
}
else
{
return false;
}
}
a[s[i]]>=a[t.top()]是为了比较优先级。
再尔判断右括号的情况
else
{
if(t.empty()) return false;
if(t.top()=='<' && s[i]=='>' ||
t.top()=='(' && s[i]==')' ||
t.top()=='[' && s[i]==']' ||
t.top()=='{' && s[i]=='}' )
{
t.pop();
}
else
return false;
}
可懂?和普通的题是一样的思路
循环结束最后判断。
if(t.empty()) return true; return false;
望采纳!!!
0
周明轩
资深光能
资深光能
第1,你在判断力没加<>括号,
其次,题上面写着“如果括号有互相包含的形式,从内到外必须是<>,(),[],{}”,意味着这是有优先级的。
我的思路如下:
遍历字符串。
判断如果是左边的括号,如果是,就判断在是否为空,如果栈为空并且s[i]的优先级要小与栈顶元素的优先级(<> > {} > [] >()),则将该元素加入栈,否则输出NO。
如果是右括号,如果栈为空或此括号和栈顶元素不匹配,输出NO,不然就删除栈顶元素。
最后判断栈是否为空,如果为空,则输出YES,不然就输出NO
望采纳
周明轩在2021-08-03 13:11:03追加了内容
我在第一行多加了一个“力”
0
陈曦
资深天翼
资深天翼
@周明轩 是这样吗
#include<iostream>
#include<stack>
#include<string>
using namespace std;
string s;
stack<char>a;
int n;
int main(){
cin>>s;
int f=0;
for(int i=0;i<s.size();i++){
if(s[i]=='<'||s[i]=='('||s[i]=='['||s[i]=='{'){
if(a.empty()&&(int(s[i])>int(a.top()) || int(s[i])-20==int(a.top()))){
a.push(s[i]);
}
else{
cout<<"NO\n";
f=1;
break;
}
}
else{
if(a.empty()||(int(s[i])-int(a.top()))<=2){
cout<<"NO\n";
f=1;
break;
}
else{
a.pop();
}
}
}
if(f==0) {
if(a.empty()) cout<<"YES";
else cout<<"NO";
}
// cout<<int('<')<<' '<<int('(')<<' '<<int('[')<<' '<<int('{')<<endl;
// cout<<int('>')<<' '<<int(')')<<' '<<int(']')<<' '<<int('}')<<' ';
//
return 0;
}
/*
遍历字符串。
判断如果是左边的括号,
如果是,就判断在是否为空,
如果栈为空并且s[i]的优先级要小与栈顶元素的优先级
(<> >()> [] >{} ),
则将该元素加入栈,否则输出NO。
如果是右括号,
如果栈为空或此括号和栈顶元素不匹配,
输出NO,不然就删除栈顶元素。
最后判断栈
*/
0
0
陈曦
资深天翼
资深天翼
#include<iostream>
#include<stack>
#include<string>
using namespace std;
string s;
stack<char>a;
int n;
int main(){
cin>>n;
while(n--){
cin>>s;
int f=0;
for(int i=0;i<s.size();i++){
if(s[i]=='<'||s[i]=='('||s[i]=='['||s[i]=='{'){
if(a.empty()&&(int(s[i])>int(a.top()) || int(s[i])-20==int(a.top()))){
a.push(s[i]);
}
else{
cout<<"NO\n";
f=1;
break;
}
}
else{
if(a.empty()||(int(s[i])-int(a.top()))<=2){
cout<<"NO\n";
f=1;
break;
}
else{
a.pop();
}
}
}
if(f==0) {
if(a.empty()) cout<<"YES";
else cout<<"NO";
}
while(!a.empty()) a.pop();
}
// cout<<int('<')<<' '<<int('(')<<' '<<int('[')<<' '<<int('{')<<endl;
// cout<<int('>')<<' '<<int(')')<<' '<<int(']')<<' '<<int('}')<<' ';
return 0;
}
/*
遍历字符串。
判断如果是左边的括号,
如果是,就判断在是否为空,
如果栈为空并且s[i]的优先级要小与栈顶元素的优先级
(<> >()> [] >{} ),
则将该元素加入栈,否则输出NO。
如果是右括号,
如果栈为空或此括号和栈顶元素不匹配,
输出NO,不然就删除栈顶元素。
最后判断栈
*/
卡了【捂脸苦笑】