請編寫程序檢查C語言源程序中下列符號是否配對:/*
與*/
、(
與)
、[
與]
、{
與}
。c++
輸入格式:
輸入爲一個C語言源程序。當讀到某一行中只有一個句點.
和一個回車的時候,標誌着輸入結束。程序中須要檢查配對的符號不超過100個。spa
輸出格式:
首先,若是全部符號配對正確,則在第一行中輸出YES
,不然輸出NO
。而後在第二行中指出第一個不配對的符號:若是缺乏左符號,則輸出?-右符號
;若是缺乏右符號,則輸出左符號-?
。code
輸入樣例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
題意blog
如上get
題解it
這裏用棧存符號,遇到右括號判斷棧頂元素是否爲對應的左括號,詳細看代碼class
這裏給幾個特殊樣例test
1./*程序
2./**/*/top
代碼
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\n"); 18 if(uh=='(')printf("("); 19 if(uh=='[')printf("["); 20 if(uh=='{')printf("{"); 21 if(uh=='*')printf("/*"); 22 printf("-?\n");//少右 23 flag=0; 24 } 25 } 26 else 27 { 28 printf("NO\n"); 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\n"); 62 return 0; 63 }