PRELOADER

当前文章 : 《PTA刷题——符合配对》

12/2/2019 —— 

PTA刷题——符合配对

请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。

输入格式:

输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

输出格式:

首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。

输入样例1:

1. void test()
1. {
1. int i, A[10];
1. for (i=0; i<10; i++) /*/
1. A[i] = i;
1. }
1. .

输出样例1:

1. NO
1. /*-?

输入样例2:

1. void test()
1. {
1. int i, A[10];
1. for (i=0; i<10; i++) /**/
1. A[i] = i;
1. }]
1. .

输出样例2:

1. NO
1. ?-]

输入样例3:

1. void test()
1. {
1. int i
1. double A[10];
1. for (i=0; i<10; i++) /**/
1. A[i] = 0.1*i;
1. }
1. .

输出样例3:

YES

解题思路

这一题需要使用模拟栈进行解答,挺麻烦的

1. #include<bits/stdc++.h>
1. using namespace std;
1. char op[]="<{[()]}>";
1. int check(char a) {
1.     for(int i=0; op[i]; i++)
1.         if(op[i]==a)return i+1;
1.     return 0;
1. }
1. string a="";
1. int main() {
1.     stack<char>st;
1.     string s;
1.     while(cin>>s) {
1.         for(int i=0; i<s.size(); i++) {
1.             if(s[i]=='/'&&s[i+1]=='*')a+='<',i++;
1.             else if(s[i]=='*'&&s[i+1]=='/')a+='>',i++;
1.             else if(check(s[i])>1&&check(s[i])<8)a+=s[i];
1.         }
1.     }
1.     for(int i=0; i<a.size(); i++) {
1.         int c=check(a[i]);
1.         if(c<5)st.push(a[i]);
1.         else {
1.             if(!st.size()) {
1.                 cout<<"NO\n?-";
1.                 c==8?cout<<"*/":cout<<a[i];
1.                 return 0;
1.             } else {
1.                 if(st.top()==op[8-c])st.pop();
1.                 else break;
1.             }
1.         }
1.     }
1.     if(st.size()) {
1.         puts("NO");
1.         st.top()=='<'?cout<<"/*":cout<<st.top();
1.         cout<<"-?";
1.     } else puts("YES");
1. 
1.     return 0;
1. }