这个题是写的最舒服的一个题了,写完后没有大改,仅仅改了下循环之类的就得到正确答案了,也算是一个小进步:
废话不说,直接上思路:
思路
使用栈的思路,进行比较:
- 对于输入的一个序列,从这个序列的第一个元素开始遍历:
- 如果这个元素的值大于我们栈顶的值或者栈为空,那么就入栈(注意可能会有栈满时还要入站的情况),直到栈顶等于这个元素
- 然后弹出栈顶元素,接下来对这个序列的下一个元素开始判断
注意:
- 当你在往栈里增加元素的时候,一定要注意不要超过最大的容量,也要注意压栈的值是递增的1,2,…,N;
- 当你发现你栈顶比你此时要检查的序列的元素大的时候,肯定是错误的因为我们压栈是按顺序,出栈是根据所给的序列,正常情况下不会出现序列中对应的元素大于栈顶的情况,比如:
5 6 4 3 7 2 1(正确的)
5 6 4 3 7 1 2(错误的)
因为2不出栈1就没办法先出栈
```c
#define _CRT_SECURE_NO_WARNINGS//为了可以使用scanf
#include <stdio.h>
#include <stdlib.h>
struct stack {
int* stack;
int head = 0;//指向栈顶元素的上一个元素
int p;//记录此时要压栈的元素
}Stack;
void Init(int MAX) {
Stack.p = 1;
Stack.head = 0;
Stack.stack = (int*)calloc(MAX, sizeof(int));
}
void Push() {
//printf("Stack.p = %d\n", Stack.p);
Stack.stack[Stack.head++] = Stack.p++;
}
int Pop() {
return Stack.stack[--Stack.head];
}
int main() {
int MAX, N, K;//N是要检查的每个序列里元素的个数
scanf("%d %d %d/n", &MAX, &N, &K);
int* a = (int*)calloc(N, sizeof(int));
int* check = (int*)calloc(N, sizeof(int));//check yes 1 or not 0
for (int index = 0;index < K;index++) {//每次输入一个检查一个
for (int i = 0;i < N;i++) {
scanf("%d", &a[i]);
}//接受输入的N个检查的数
Init(MAX);//创建一个栈
//Push(1);//第一个进栈的一定是1
for (int i = 0;i < N;i++) {//对于输入的序列一个元素进行检查
int is_break = 0;
while (a[i] > Stack.stack[Stack.head - 1] || Stack.head == 0) {//栈顶元素小于此时要检查的元素 不断的入栈
//printf("Max %d\n", Stack.head);
if (Stack.head >= MAX) {//已近满了但还要压 说明这个序列不合适
check[index] = 0;
is_break = 1;
break;
}
else {
Push();
}
}
if (is_break)
break;//跳出这个序列的检查
if (a[i] == Stack.stack[Stack.head - 1]) {//等于检查元素
Pop();
if (i == N - 1) {//这个序列的最后一个元素也满足
check[index] = 1;
}
continue;
}
else {//大于检擦元素
check[index] = 0;
break;
}
}//结束对一个序列中N个值检测
}//结束对K个序列的检测
for (int i = 0;i < K;i++) {
//printf("check %d\n", check[i]);
if (check[i] == 1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}