题目描述:
P6 括号匹配 (15分)
检查一段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
一道比较简单的栈的应用题
但要着重考虑到会出现的两种情况:(1)输入中只有左括号 (2)输入中只有右括号 (3)俩都没有
两种判断方式:判断左括号数是否和右括号数相等,或判断最后stack(栈)内是否为空
c++代码如下:
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main()
{
stack<char> str2;
char str[1200];
int t = 1; //用t来判断括号匹配
cin.getline(str,1000);//输入
int num1 = 0,num2 = 0;
for(int i = 0;i<strlen(str);i++){
if(str[i]=='('||str[i]=='{'||str[i]=='['){
num1++;
str2.push(str[i]);//左括号入栈
}
else if(str[i]==')'||str[i]=='}'||str[i]==']'){
num2++;
if(str2.empty()){//如果是空的,则不用判断
t = 0;
}
if(!str2.empty()){//如果非空,判断左右是否匹配
char c = str2.top();
if(c=='('&&str[i]!=')'||c=='{'&&str[i]!='}'||c=='['&&str[i]!=']'){
t = 0;
}
str2.pop();
}
}
//如果全是左括号
}
if(num1!=num2){
t = 0;
}
if(t==1){
printf("%d %d\n",num1,num2);
printf("YES\n");
}
else if(t==0){
printf("%d %d\n",num1,num2);
printf("NO\n");
}
return 0;
}
或用if(!str2.empty())