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. }