请编写程序检查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 <bits/stdc++.h>
using namespace std;
#define size 100
struct Stack
{
char* base;
char* top;
int stacksize;
};
char t;
void InitStack(Stack &s){
s.base=(char*)malloc(size*sizeof(char));
s.top=s.base;
s.stacksize=size;
}
void Push(Stack& s,char e){
*s.top=e;
*s.top++;
}
bool Pop(Stack& s){
if(s.base==s.top)return false;
--s.top;
return true;
}
char getTop(Stack &s){
if(s.base!=s.top)return *(s.top-1);
}
bool StackEmpty(Stack &s){
if(s.base==s.top)return false;
return true;
}
bool deal(Stack& s){
char c[101];
bool f=true;
while(cin>>c){
if(c[0]=='.'&&c[1]=='\0')break;
for(int i=0;c[i]!='\0';i++){
if(c[i]=='/'&&c[i+1]=='*'){
Push(s,c[i]);
Push(s,c[i+1]);
i++;
}
else if(c[i]=='('||c[i]=='{'||c[i]=='['){
Push(s,c[i]);
}
else if(c[i]=='*'&&c[i+1]=='/'){
if(StackEmpty(s)&&getTop(s)=='*'){
Pop(s);
if(StackEmpty(s)&&getTop(s)=='/'){
Pop(s);
}
else {
f=false;
t=c[i];
break;
}
}
else {
f=false;
t=c[i];
break;
}
}
else if(c[i]==')'){
if(StackEmpty(s)&&getTop(s)=='('){
Pop(s);
}
else {
f=false;
t=c[i];
break;
}
}
else if(c[i]=='}'){
if(StackEmpty(s)&&getTop(s)=='{'){
Pop(s);
}
else {
f=false;
t=c[i];
break;
}
}
else if(c[i]==']'){
if(StackEmpty(s)&&getTop(s)=='['){
Pop(s);
}
else {
f=false;
t=c[i];
break;
}
}
}
}
if(!StackEmpty(s)&&f)return true;
else return false;
}
int main()
{
Stack s;
InitStack(s);
if(deal(s))cout<<"YES"<<endl;
else {
cout<<"NO"<<endl;
if(StackEmpty(s)) {
if(getTop(s)=='(')cout<<'('<<'-'<<'?'<<endl;
if(getTop(s)=='[')cout<<'['<<'-'<<'?'<<endl;
if(getTop(s)=='{')cout<<'{'<<'-'<<'?'<<endl;
if(getTop(s)=='*')cout<<'/'<<'*'<<'-'<<'?'<<endl;
}
else {
if(t==')')cout<<'?'<<'-'<<')'<<endl;
if(t==']')cout<<'?'<<'-'<<']'<<endl;
if(t=='}')cout<<'?'<<'-'<<'}'<<endl;
if(t=='*')cout<<'?'<<'-'<<'*'<<'/'<<endl;
}
}
}