|
问题描述 |
|
| 5分 | |
| 5分 | |
| 10分 |
奔跑吧,参考:
int N, M, K;
int *Push, *Pop, *Stack;
int i, j, r, s;
int main(void)
{
scanf("%d%d%d", &M, &N, &K);
Stack = malloc(sizeof(int)*M);
Push = malloc(sizeof(int)*N);
Pop = malloc(sizeof(int)*N);
//读入压栈序列
for (i = 0; i < N; i++) scanf("%d", Push + i);
r = 0;
while (r < K)
{
//读入出栈序列
for (j = 0; j < N; j++) scanf("%d", Pop + j);
i = j = 0;
s = -1;
while (j < N)
{
if (-1 == s || Stack[s] < Pop[j]) //栈若是空的或栈顶元素小于当前出栈元素,则入栈
{
if(s < M - 1) Stack[++s] = Push[i++];
else //栈空间有限,无法继续入栈
{
printf("NO\n");
break;
}
}
if (Stack[s] == Pop[j]) //出栈
{
s--;
j++;
}
else if (Stack[s] > Pop[j])
{
printf("NO\n");
break;
}
}
if (j == N) printf("YES\n"); //全部都可以出栈,则序列正确
r++;
}
free(Push);
free(Pop);
free(Stack);
return 0;
}
|
| 20分 |
直接比对,不等的部分压栈,就知道结果
#include <stdio.h>
#define N (1000+10)
int n,m,k, a[N],b[N],sk[N];
bool check(){
int top =0,*pa=a,*pae=a+n,*pb=b,*pbe=b+n;
while(pb!=pbe){
if(pa<pae&&*pb==*pa) {
if(top==m) return false;
++pb,++pa;
}
else if(top&&*pb==sk[top-1]) ++pb,--top;
else if(pa<pae) {
if(top==m) return false;
sk[top++] =*pa++;
}else return false;
}
return true;
}
int main ()
{
scanf("%d%d%d",&m,&n,&k);
for(int i=0;i<n;i++) scanf("%d",a+i);
while(k--){
for(int i=0;i<n;i++) scanf("%d",b+i);
printf("%s\n",check() ? "YES" : "NO");
}
}
|