问题描述 |
|
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"); } } |