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


請編寫程序檢查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\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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM