题目描述:
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())
来源:https://www.cnblogs.com/ziggystardust-pop/p/12570624.html