PTA 7-2 符號配對(棧模擬)

請編寫程序檢查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 }
相關文章
相關標籤/搜索