1. 程式人生 > >習題3.8 符號配對(20 分) 浙大版《數據結構(第2版)》題目集

習題3.8 符號配對(20 分) 浙大版《數據結構(第2版)》題目集

檢查 size pro 是否 ring 所有 編寫 bre ace

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



/**/的判斷在作祟,搞得我總是最後一個測試點錯誤,再讀入的時候用<>代替了,方便判斷了,就對了。

#include <iostream>
#include <map>
#include <algorithm>
#include <stack>
#define eof "."
using namespace std;

int main()
{
    string s;
    char a[101],b[101];
    int d = 0,c = 0;
    int flag = 1;
    map<char,char> q;
    q[(] = );
    q[{] = 
}; q[[] = ]; q[<] = >; while(cin>>s&&s != eof) { for(int j = 0;j < s.size();j ++) { if(s[j] == [ || s[j] == ] || s[j] == { || s[j] == } || s[j] == ( || s[j] == ))a[d ++] = s[j]; else if(s[j] == / && s[j+1] == *)a[d ++] = <,j ++; else if(s[j] == * && s[j+1] == /)a[d ++] = >,j ++; } } int j; // a[d]=‘\0‘; // cout<<a<<endl; for(j = 0;j < d;j ++) { if(a[j] == ( || a[j] == [ || a[j] == { || a[j] == <) { b[c ++] = a[j]; } else if(c&&q[b[c-1]] == a[j])c --; else { flag = 0; cout<<"NO"<<endl; if(!c) { if(a[j]==>)cout<<"?-*/"; else cout<<"?-"<<a[j]; } else { if(b[c - 1] == <)cout<<"/*-?"; else cout<<b[c - 1]<<"-?"; } break; } } if(flag) { if(!c)cout<<"YES"<<endl; else { cout<<"NO"<<endl; if(b[c - 1] == <)cout<<"/*-?"; else cout<<b[c - 1]<<"-?"; } } }

習題3.8 符號配對(20 分) 浙大版《數據結構(第2版)》題目集