7-7 符号配对 (30 分)

请编写程序检查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
#include
typedef struct
{
	int *data;
	int top;
}stack,*Stack;

void initstack(Stack S)
{
	S->data=(int*)malloc(100*sizeof(int));
	S->top=-1;
}

int panduan(char a)
{
	switch(a)
	{
		case '(':
			return 1;
		case  '[':
			return 2;
		case '{':
			return 3;
		case ')':
			return -1;
		case ']':
			return -2;
		case '}':
			return -3;
		case '/':
			return 4;
		case '*':
			return 5;
		case '.':
			return 10;
		case '\n':
			return 11;
		default:
			return 0;
	}
}

char* chu(int number)
{
	char *a; 
	switch(number)
	{
		case 1:
			  a="(";
			return a;
		case -1:
			a=")";
			return a;
		case 2:
			a="[";
			return a;
		case -2:
			a="]";
			return a;
		case 3:
			a="{";
			return a;
		case -3:
			a="}";
			return a;
		case 6:
			a="/*";
			return a;
		case -6:
			a="*/";
			return a;
		default :
			return 0;
	}
}

int main()
{
	Stack S;
	int state=0;
	S=(Stack)malloc(sizeof(stack));
	initstack(S);
	char a;
	int flag=0;
	int number;
	int lastnumber;
	int last=0;
	while(1)
	{
		flag++;
		scanf("%c",&a);
		number=panduan(a);
		if(number==10)
		{
			flag=9;
			continue;
		}
		if(number==11&&flag==10)
		{
			number=lastnumber;
			break;	
		}
		if(number==11)
		continue;
		if(number==4&&last!=5)
		{
			last=4;
			continue;
		}
		else if(number==5&&last==4)
		{
			number=6;
			last=0;
		}
		else if(number==5&&last!=4)
		{
			last=5;
			continue;
		}
		else if(number==4&&last==5)	
		{
			number=-6;
			last=0;
		}
		if(number!=0&&number>0)
		{
			S->data[++S->top]=number;
		}
		else if(number!=0&&number<0)
		{
			if((S->data[S->top]+number)==0&&S->top>=0)
			S->top--;
			else if(S->top==-1)
			{
				printf("NO\n?-%s",chu(number));
				state=1;
				break;
			}
			else
			{
				state=1;
				printf("NO\n%s-?",chu(S->data[S->top]));
				break;
			}
		}
		lastnumber=number;
	}
	if(S->top==-1&&state!=1)
	printf("YES");
	else if(S->top!=-1&&state!=1)
	printf("NO\n%s-?",chu(S->data[0]));	

}

你可能感兴趣的:(数据结构#栈)