R7-4 括号匹配

Author Avatar
小包
发表:2024-11-03 04:26:10
修改:2024-11-03 04:26:10

检查一段C语言代码的小括号( )、 中括号 [ ] 和大括号{ } 是否匹配。

输入格式:

在一行中输入一段C语言代码,长度不超过1000个字符(行末以换行符结束)。

输出格式:

第一行输出左括号的数量和右括号的数量,中间以一个空格间隔。

若括号是匹配的,在第二行打印YES,否则打印NO

输入样例1:

for(int i=0; i<v; i++){ visited[i] = 0; for(int j=0; j<v; j++) scanf("%d",&(g->Adj[i][j])); }

输出样例1:

8 8
YES

输入样例2:

for(int i=0; i<v; i++) a(i]=0;

输出样例2:

2 2
NO
#include <iostream>
#include <stack>
#include <string>

using namespace std;

// 函数用于检查两个括号是否匹配
bool isMatching(char open, char close) {
    if(open == '(' && close == ')') return true;
    if(open == '[' && close == ']') return true;
    if(open == '{' && close == '}') return true;
    return false;
}

int main(){
    string s;
    // 读取包括空格在内的整行输入
    getline(cin, s);
    
    int left_count = 0, right_count = 0;
    stack<char> stk;
    bool mismatch = false;
    
    for(char ch : s){
        if(ch == '(' || ch == '[' || ch == '{'){
            left_count++;
            stk.push(ch);
        }
        else if(ch == ')' || ch == ']' || ch == '}'){
            right_count++;
            if(stk.empty()){
                mismatch = true;
                // 虽然不匹配,但继续以统计所有括号
            }
            else{
                char top = stk.top();
                stk.pop();
                if(!isMatching(top, ch)){
                    mismatch = true;
                }
            }
        }
    }
    
    // 处理完所有字符后,检查栈是否为空
    if(!stk.empty()){
        mismatch = true;
    }
    
    // 输出左括号和右括号的数量
    cout << left_count << " " << right_count << endl;
    
    // 输出匹配结果
    if(!mismatch && left_count == right_count){
        cout << "YES";
    }
    else{
        cout << "NO";
    }
    
    return 0;
}

评论