7-1 括号匹配 (20分)(数据结构)

7-1 括号匹配 (20分)(数据结构)

检查一段C语言代码的小括号( )、 中括号 [ ] 和大括号{ } 是否匹配。

输入格式:

在一行中输入一段C语言代码,长度不超过1000个字符(行末以换行符结束)。

输出格式:

第一行输出左括号的数量和右括号的数量,中间以一个空格间隔。 若括号是匹配的,在第二行打印YES,否则打印NO。

输入样例1:

for(int i=0; i<v; i++){ visited[i] = 0; for(int j=0; j<v; j++)
scanf("%d",&(g->Adj[i][j])); }

输出样例1:

8 8
YES

输入样例2:

for(int i=0; i<v; i++) a(i]=0;

输出样例2:

2 2
NO

思考

  • 看到这道题,第一反应是要在一群代码里找到C语言常用的大中小括号,就要过滤掉代码里的其他内容,还要判断左右括号是否配对,按要求组合等情况。在这里我是先用一个数组去将代码存起来,在通过遍历、压栈、出栈等操作去实现括号的配对查询。
  • 当遇到左括号时就被压进栈中,在遇到右括号时出栈,当出栈的元素跟所遇到的右括号不匹配时就可知道是不匹配的情况。当所有代码遍历完后,栈中还有元素,就证明括号也是不匹配的。
  • 栈的特性也正好符合括号匹配查找的特点,我在这里用的是栈的链式储存去完成。

代码展示

#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#define MAX 1001
typedef char ElementType;

typedef struct stack { //在这里新建一个栈结构
	ElementType  a;//这个用来存储括号类型
	struct stack *next;//指向下一个结点
} List,*lp;

struct stack *create();//初始化栈
int Push(lp L,ElementType x);//入栈
int Pop(lp L,ElementType e);//出栈

int main(void) {

	char s[MAX];//新建一个数组并存储输入的代码
	gets(s);
	int i=0,left=0,right=0,flag=1;//分别是左括号、右括号的计数和判断是否匹配的旗帜
	lp L=NULL;//新建一个栈指针,并初始化(不熟悉的同学可以去参考一下浙大线性结构的教材)
	L=create();

	while(s[i]!='\0') {//开始对数组遍历
	//在遍历过程中,只对括号元素反应。
		if(s[i]=='(') {
			Push(L,'(');//遇到左括号就进行压栈,并计数
			left++;
		} else if(s[i]=='[') {
			Push(L,'[');
			left++;
		} else if(s[i]=='{') {
			Push(L,'{');
			left++;
		} else if(s[i]==')') {
			//遇见右括号就先判断括号是否匹配,并开始计数
			if(Pop(L,'(')!=1) flag=0 ;//这里我直接用相应的左括号去配对
			right++;
		} else if(s[i]==']') {
			if(Pop(L,'[')!=1) flag=0 ;
			right++;
		} else if(s[i]=='}') {
			if(Pop(L,'{')!=1) flag=0 ;
			right++;
		}
		i++;
	}
    if(L->next!=NULL) flag=0;//在遍历完所有代码后就判断栈中是否为空
	printf("%d %d\n",left,right);//输出左右括号的个数
	if(flag==1) {//输出匹配的情况
		printf("YES\n");
	} else {
		printf("NO\n");
	}
}

struct stack *create() {//初始化
	lp s=NULL;//新建一个栈指针
	s=(lp)malloc(sizeof(lp));//申请空间
	s->next=NULL;
	return s;
}

int Push(lp L,ElementType x) {//压栈
	lp p=(lp)malloc(sizeof(lp));//新建结点
	p->a=x;//将左括号压进栈
	p->next=L->next;//将next指针进行更新
	L->next=p;//连接链表
	return 1;
}

int Pop(lp L,ElementType e) {
	lp p=(lp)malloc(sizeof(lp));//新建一个结点
	if(L->next==NULL) return 0;//先判断链表是否为空
	p=L->next;//将栈顶的元素取出
	if(p->a==e) {//如果括号对得上,就返回1
		L->next=p->next;//指向下个结点
		free(p);//将刚申请的结点空间free掉
		return 1;
	} else {//对不上则返回0
		return 0;
	}
}

这个是我PTA上提交的情况:这个是我PTA上提交的情况

  • 这道题是我花了不少时间去琢磨的(因为我菜),思路还是很清晰的,只是我操作方面存在不少问题,也希望我的这个代码能给你们提供一些思路,也欢迎大家提出更好的做法。
  • 喜欢的朋友能否给个赞?谢谢各位看官老爷了。(第一次写博文)

2020.03.29

### 回答1: 可以使用检查一段C语言代码小括号( )、中括号 [ ]和大括号{ }是否匹配。具体方法是,遍历代码中的每个字符,如果遇到左括号(、[或{,就将其压入中;如果遇到右括号)、]或},就将顶元素弹出,判断是否与当前右括号匹配。如果匹配,则继续遍历;如果不匹配,则说明括号不匹配,直接返回错误。最后,如果为空,则说明所有括号都匹配,返回正确;否则,说明还有未匹配的括号,返回错误。 ### 回答2: 在C语言编程中,小括号中括号大括号是常用的符号。在编写代码的过程中,我们要确保这些括号在使用中是匹配的。如果括号不匹配,就会导致编译错误,程序运行出现异常等问题。因此,我们需要仔细检查代码中的括号是否匹配,以避免这些问题的出现。 首先,我们需要了解各种括号的使用方法和规则。小括号()通常用于表示函数的调用和参数的传递。中括号[]则是用于表示数组的下标。而大括号{}则用于表示代码块的起始和结束,并且可以嵌套使用。在代码中,大括号通常用于控制流语句中的代码块,如if、for和while语句。 接着,我们可以采用一些方法来检查括号是否匹配。例如,我们可以遵循以下检查步骤: 1. 逐个检查小括号中括号大括号,确认每个括号是否都是成对出现的。 2. 检查嵌套的括号,确认括号的嵌套层次是否正确。 3. 检查括号的位置和语法是否正确,如小括号只能用于函数调用和参数传递,中括号只能用于数组下标,大括号只能用于代码块等。 此外,我们还可以采用一些工具和技术来完成这个任务。例如,在使用一些IDE编辑器时,它们可以自动检测和提示括号不匹配的情况。同时,在编译代码之前,我们也可以使用一些工具来检查代码的语法和规范性,以确保括号使用的正确性。 总之,在编写C语言代码时,括号的匹配是一项非常重要的任务。只有确保括号使用的正确性,才能保证程序的正常运行和开发的高效性。我们应该养成良好的编程习惯,时刻注意括号的使用,避免因括号不匹配而带来的麻烦。 ### 回答3: 在C语言中,小括号( )中用于表示函数调用时的参数列表,中括号 [ ] 用于表示数组下标,大括号 { } 则用于表示代码块。当我们编写代码时,正确匹配小括号中括号大括号是非常重要的,因为括号的匹配错误可能会导致程序无法正常编译或运行,从而使得我们浪费宝贵的时间来寻找错误。 对于小括号匹配,我们需要检查每个左括号是否都有与之匹配的右括号,而且左右括号的顺序也不能颠倒。例如,如果我们在函数调用过程中缺少右括号,则会导致编译器抛出语法错误。 对于中括号匹配,我们同样需要检查每个左括号是否都有与之匹配的右括号,而且同样不能颠倒左右括号的顺序。如果我们在访问数组元素时缺少左括号,则编译器同样会抛出语法错误;如果我们缺少右括号,则会导致程序访问数组越界。 对于大括号匹配,我们需要确保每个左括号都有与之匹配的右括号,并且左右括号的顺序也不能颠倒。如果我们在编写代码块时缺少右括号,则编译器会抛出语法错误,同时程序也无法正常运行。 总的来说,要正确匹配小括号中括号大括号,我们需要仔细检查代码中每个括号的左右匹配是否正确,并确保它们的顺序也是正确的。只有括号匹配正确,我们的代码才能够被正确编译和运行。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值