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<stdio.h>
#include<stdlib.h>
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]));	

}
在 C 语言源程序中,符号配对是非常重要的,特别是用于控制结构如注释、条件语句和循环等。DS课程组的题目要求检测四种特定的符号对:`/*` 与 `*/`(多行注释)、`( ` 与 `)`(圆括号)、`[ ` 与 `]`(方括号)以及 `{ ` 与 `}`(花括号)。为了编写这样一个程序,你可以遍历源代码字符串,并维护一个栈来存储当前未关闭的左符号。 下面是一个简单的伪代码示例: ```c #include <stdio.h> #include <string.h> bool is_pair(char open_char, char close_char) { return open_char == '{' && close_char == '}'; } void check_pairs(const char* code) { stack<char> pairs; for (int i = 0; code[i]; i++) { if (code[i] == '/' && code[i + 1] == '*') { // 处理 /* */ int j = i; while (code[j] != '*' || code[j + 1] != '/') { j++; if (j == strlen(code)) break; } if (j == strlen(code)) return false; // 注释结束前未找到结束符 i = j + 2; // 跳过结束的 */ 对 } else if (is_pair(code[i], code[i+1])) { pairs.push(open_char); } else if (!pairs.empty() && code[i] == close_char) { if (pairs.top() != open_char) return false; pairs.pop(); } else { // 如果遇到不是成对的字符,且栈为空或者非成对字符,返回false if (pairs.empty()) return false; } } // 检查栈是否为空,所有符号都已正确配对 return pairs.empty(); } int main() { const char* source_code = "your_c_code_here"; if (check_pairs(source_code)) { printf("符号配对正确。\n"); } else { printf("符号配对错误。\n"); } return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值