请编写程序检查C语言源程序中下列符号是否配对:/*
与*/
、(
与)
、[
与]
、{
与}
。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.
和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES
,否则输出NO
。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号
;如果缺少右符号,则输出左符号-?
。
输入样例1:
void test()
{
int i, A[10];
for (i=0; i<10; i++) /*/
A[i] = i;
}
.
输出样例1:
NO
/*-?
输入样例2:
void test()
{
int i, A[10];
for (i=0; i<10; i++) /**/
A[i] = i;
}]
.
输出样例2:
NO
?-]
输入样例3:
void test()
{
int i
double A[10];
for (i=0; i<10; i++) /**/
A[i] = 0.1*i;
}
.
输出样例3:
YES
题意
如上
题解
这里用栈存符号,遇到右括号判断栈顶元素是否为对应的左括号,详细看代码
这里给几个特殊样例
1./*
2./**/*/
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 stack<char> sc; 5 int flag=1; 6 int check(char ch) 7 { 8 if(!sc.empty()) 9 { 10 char uh=sc.top(); 11 if(uh=='('&&ch==')')sc.pop(); 12 else if(uh=='['&&ch==']')sc.pop(); 13 else if(uh=='{'&&ch=='}')sc.pop(); 14 else if(uh=='*'&&ch=='*')sc.pop(); 15 else 16 { 17 printf("NO "); 18 if(uh=='(')printf("("); 19 if(uh=='[')printf("["); 20 if(uh=='{')printf("{"); 21 if(uh=='*')printf("/*"); 22 printf("-? ");//少右 23 flag=0; 24 } 25 } 26 else 27 { 28 printf("NO "); 29 printf("?-");//少左 30 if(ch==')')printf(")"); 31 if(ch==']')printf("]"); 32 if(ch=='}')printf("}"); 33 if(ch=='*')printf("*/"); 34 flag=0; 35 } 36 } 37 int main() 38 { 39 char a[1000]; 40 for(;;) 41 { 42 gets(a+1); 43 if(a[1]=='.')break; 44 if(flag==0)continue; 45 for(int i=1;a[i];i++) 46 { 47 char ch=a[i],nh=a[i+1];//ch当前,nh下一个 48 if(ch=='('||ch=='['||ch=='{')//左 49 sc.push(ch); 50 else if(ch=='/'&&nh=='*')//这里特判下/*的情况 51 sc.push('*'),i++; 52 else if(ch==')'||ch==']'||ch=='}'||ch=='*'&&nh=='/')//右 53 { 54 if(ch=='*'&&nh=='/')i++;//这里特判下*/的情况 55 check(ch); 56 } 57 if(flag==0)break;//如果不行直接跳出 58 } 59 } 60 if(!sc.empty()&&flag)check(' ');//判断只有1个符号的情况 61 if(flag)printf("YES "); 62 return 0; 63 }