问题标题: 酷町堂:2069:括号匹配3

0
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,不然就删除栈顶元素。
最后判断栈
*/

卡了【捂脸苦笑】

我要回答