HUST Online Judge WebBoard
Problem 4199 >> 求大佬告知怎么用c写,我的老是错误20%
201803010218 @ 2019-10-19 14:50:45
[ Quote ] [ Edit ] [ Delete ] 1#
#include"stdio.h"
#include"stdlib.h"

typedef struct
{
int a[1000];
int m,flag;
int top;
}K;

K *init()
{
K *p;
p=(K*)malloc(sizeof(K));
p->top=-1;
p->flag =-1;
return p;
}

void push(K *p,int x)
{
p->top++;
if(p->top <100 )
{
p->a[p->top ]=x;
p->flag ++;
}
else
printf("error\n");
}

void pop(K *p)
{
int x;
if(p->top ==-1)
printf("error\n");
else
{
x=p->a[p->top];
p->top --;
p->flag --;
//printf("让元素出栈:%d\n",x);
}

}

int main()
{
int i,k,l[1000],t,o[1000],n,j,r;
K *p;
scanf("%d",&k);
while(k>0)
{
p=init();
scanf("%d %d",&n,&t);
p->m=t;
//printf("入栈固定顺序和出火车站顺序:\n");
for(i=0;i<n;i++)
{
scanf("%d",&l[i]);
o[i]=i;
//printf("%d %d\n",l[i],o[i]);
}
i=0;
j=0;
//printf("\n");
while(j<n)
{
r=0;
if(l[j]==p->a[p->top]&&p->top >=0)
{
pop(p);
j++;
r=1;
}
if(l[j]>o[i]&&o[i]>=0)
{
push(p,o[i]);
//printf("入栈:%d\n",p->a[p->top ]);
if(p->flag >=p->m)
{
//printf("此时火车已满,这次入栈失败\n");
break;
}
o[i]=-99;
i++;
r=1;
}
if(l[j]==o[i])
{
//printf("直接驶离火车站:%d\n",o[i]);
if(i<n-1)
{
i++;
}
j++;
r=1;
}
if(r==0)
{
break;
}
}
if(p->top >=0||p->flag>=p->m)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
k--;
}
return 0;
}
201803140220 @ 2019-10-21 22:11:20
[ Quote ] [ Edit ] [ Delete ] 2#
再考虑一下你的 pop() 函数
对于栈空的输出判断还需要再考量一下
201803010218 @ 2019-10-22 14:24:46
[ Quote ] [ Edit ] [ Delete ] 3#
抱歉,还是不太能理解....我在主函数里面有判断如果栈没空就输出NO以及调用pop函数之前也判断了栈空,
对于栈空的输出判断是指哪个方面...能细说一下么?...感谢大佬了。。。
201803140220 @ 2019-10-22 14:48:49
[ Quote ] [ Edit ] [ Delete ] 4#
是我描述的有些不太准确。。。
对!就是在调用 pop() 函数前你判断了栈是否为空
但只是判断了不空才输出,若是栈空了但后面条件不满足你的while()循环就会直接break
然而break后就没有再进行进一步处理
201803010218 @ 2019-10-22 15:59:41
[ Quote ] [ Edit ] [ Delete ] 5#
我在循环里放了一个标准量r,作用是如果上面3个if 语句都没执行就让while循环break跳出去,
这个时候代表存火车出站顺序的l[ ]数组的元素在栈内但是和栈顶元素不同。栈内元素不可以按那个顺序正常出列
break之后再通过是否为空栈来判断是不是所有火车正常出站(出栈)
在调用pop()函数时判断非空栈才进行,其实如果没有那句 &&p->top >=0 就算是空栈if语句前半部分 (l[j]==p->a[p->top]应该也不会让它进循环吧...
201803140220 @ 2019-10-22 18:08:52
[ Quote ] [ Edit ] [ Delete ] 6#
判断完是不是所有火车正常出站
还需要再判断一下你的j和i是否都走到了头即所有火车都处理完了
我举个例子吧:
若是调度站需要同一辆火车多次出站的时候
你的栈已经空了并且栈顶也没有超限
但由于同一辆火车出两次站是无法实现的
因此实际上应该该输出NO
但你的程序就会出现问题(仍输出YES)
201803010218 @ 2019-10-22 20:45:04
[ Quote ] [ Edit ] [ Delete ] 7#
噢噢噢噢,还可以有两辆一样的火车出站这种情况啊。
原来如此,考虑太少了,刚刚在最后的if语句里加了一个判断条件
现在终于过了,感谢大佬啦,牛啊