符号配对——遇到bug无法解决?可以进来看看(附赠做题方法良心总结)

题目

在这里插入图片描述
在这里插入图片描述

答案

#include<stdio.h>
int pos=-1;
int top=-1;
char topp(char str[])
{
	return str[top];
}
void pop()
{
	top--;
}
void push(char stack[],char tmp)
{
	stack[++top]=tmp;
}
int main()
{
	char str[250];
	char stack[250];
	char save[250];
	int i;
	while(gets(str))
	{
		if(str[0]=='.'&&!str[1]) break;
		for(i=0;str[i];i++)
		{
			if(str[i]=='('||str[i]==')'||str[i]=='['||str[i]==']'||str[i]=='{'||str[i]=='}')
			save[++pos]=str[i];
			else if(str[i]=='/'&&str[i+1]=='*')
			{
				save[++pos]='x';i++;
			}
			else if(str[i]=='*'&&str[i+1]=='/')
			{
				save[++pos]='y';i++;
			}
		}
	}
	int flag=0;
	char tmp;
	for(i=0;i<=pos;i++)
	{
		if(save[i]=='('||save[i]=='['||save[i]=='{'||save[i]=='x')
		push(stack,save[i]);
		else if(save[i]==')')
		{
			if(top!=-1&&topp(stack)=='(') pop();
			else
			{
				tmp=save[i];
				flag=1;
				break;
			}
		}
		else if(save[i]==']')
		{
			if(top!=-1&&topp(stack)=='[') pop();
			else
			{
				tmp=save[i];
				flag=1;
				break;
			}
		}
		else if(save[i]=='}')
		{
			if(top!=-1&&topp(stack)=='{') pop();
			else
			{
				tmp=save[i];
				flag=1;
				break;
			}
		}
		else if(save[i]=='y')
		{
			if(top!=-1&&topp(stack)=='x') pop();
			else
			{
				tmp=save[i];
				flag=1;
				break;
			}
		}
	}
	if(!flag&&top==-1) printf("YES");
	else
	{
		printf("NO\n");
		if(top!=-1)
		{
			if(topp(stack)=='(') printf("(-?");
			else if(topp(stack)=='[') printf("[-?");
			else if(topp(stack)=='{') printf("{-?");
			else if(topp(stack)=='x') printf("/*-?");
		}
		else
		{
			if(tmp==')') printf("?-)");
			else if(tmp==']') printf("?-]");
			else if(tmp=='}') printf("?-}");
			else if(tmp=='y') printf("?-*/");
		}
	}
}

测试点

在这里插入图片描述

参考

我都代码基本都是参照这位博主的文章里的代码,里面有这道题目的详细解答,而我这篇文章主要是讲自己遇到的问题供大家参考

https://blog.csdn.net/qq_43179428/article/details/89712232

问题总结(关键)

问题1

如果发现最后一个节点你死活过不了,那你就要思考一下你的解题逻辑是否存在问题了。我举个例子:([)],这里是无法匹配的,你可以把这个理解为编译,这个模式编译肯定通过不了,因为夹在两个小括号之间的左中括号无法与括号外的右中括号相匹配

遇到问题1该怎么办

如果遇到问题1,我建议大家直接到我给的参考链接去学习一下那位博主的思想,千万不要在自己的代码上改来改去。因为你的代码既然出现问题,就一定是不完整的,你改来改去就是拆东墙补西墙,多数情况下是没有意义的,还浪费时间(本人就因为改来改去浪费了2个小时的时间,呜呜呜)

当你决定参考这位博主的文章后,我再说几个我遇到的问题:

问题2

输入时因为没有判断‘.’导致段错误

问题3

下面这行代码里的’||‘误写为’&&’

if(str[i]=='('||str[i]==')'||str[i]=='['||str[i]==']'||str[i]=='{'||str[i]=='}')

问题4:

下面的x与y写反了

else if(save[i]=='y')
		{
			if(top!=-1&&topp(stack)=='x') pop();

问题5

这里的==误写为!=

if(!flag&&top==-1) printf("YES");

问题6

NO忘了输出

	printf("NO\n");

总结做题方法

问题总结的差不多了,最后说两句我的心得

我们发现一个更好的解题逻辑固然是好事,但千万不要局限于看了一两遍就说:哦,我懂了,博主真强!,然后将代码复制上去通过答案,接着做下一题

除非你是大佬,否则我觉得绝大多数情况下,如果你只是看懂了,再让你码一遍肯定还会有一堆bug,这就说明你并没有真正掌握这个解题方法;何况再过个一周,你连看懂的印象都会消失,更别提再码一遍了

所以我的建议是,先自己尝试码一遍代码,有什么地方忘了可以看一下答案,再接着码,千万不要对着码,不然还是忘;在这一遍通过测试后,再完全依靠自己的记忆或者理解独立码一遍,这一遍基本不可能一次成,那就码完后找问题,解决后重新码一边,直到完全通过测试为止。而到了这个时候,你想不会也不太可能了

当然,我本人的能力很一般,这种代码要码好几遍,但我想即使是大佬不是也要经历这个过程吗?做题快毫无意义,100道数据结构题你到网上复制粘贴,100道一会儿就搞定了,但毫无意义

尾声

仅以此题与大家共勉,希望大家求同存异,我不是来与大家争论的,而是来分享的,最后还是要感谢大家耐心看到这里。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
R语言中有许多非参数检验方法,适用于数据不满足正态分布假设或无法满足其他检验方法的假设条件的情况。以下是一些常见的非参数检验方法及其适用场景: 1. Wilcoxon符号秩检验:用于比较一对配对样本的中位数是否有显著差异。适用于连续型数据,例如比较同一组受试者在两个时间点的得分变化。 2. Mann-Whitney U检验:用于比较两个独立样本的中位数是否有显著差异。适用于连续型数据,例如比较两组患者的疾病严重程度。 3. Kruskal-Wallis检验:用于比较三个或更多组独立样本的中位数是否有显著差异。适用于连续型数据,例如比较不同药物治疗组的效果差异。 4. Friedman秩和检验:用于比较三个或更多组配对样本的中位数是否有显著差异。适用于连续型数据,例如比较同一组受试者在不同治疗条件下的得分变化。 5. McNemar检验:用于比较两个配对样本的分类结果是否有显著差异。适用于分类变量,例如比较同一组受试者在两个时间点的分类变化。 这些非参数检验方法可以用来解决各种问题,如比较两个或多个组的中位数、比较配对样本的差异、评估分类变量的相关性等。它们不依赖于数据的分布假设,更加灵活适用于各种类型的数据。但需要注意的是,非参数检验方法通常对样本量较小或连续型数据较少的情况更为适用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值