R7-4 括号匹配
检查一段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;
}