题目
答案
#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.youkuaiyun.com/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道一会儿就搞定了,但毫无意义
尾声
仅以此题与大家共勉,希望大家求同存异,我不是来与大家争论的,而是来分享的,最后还是要感谢大家耐心看到这里。