这道题的核心就是比较栈顶元素与数组指针V处的元素N的大小,如果v处的元素N大,则把这个数从1到N逐一压栈。逻辑过程有点抽象,不太好想到。
原题链接
以下为代码
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 1000
typedef struct node
{
int Data[MaxSize];
int cap;
int top;
}Stack;
int M, N, K;
Stack* CreatStack()
{
Stack* Ptrs = (Stack*)malloc(sizeof(struct node));
Ptrs->cap = MaxSize;//
Ptrs->top = -1;
return Ptrs;
}
void Push(Stack* Ptrs, int ele)
{
if (Ptrs->top == Ptrs->cap - 1)
{
printf("FULL");
return;
}
Ptrs->top++;
Ptrs->Data[Ptrs->top] = ele;
}
void Pop(Stack* Ptrs)
{
if (Ptrs->top == -1)
{
printf("Empty");
return;
}
Ptrs->top--;
}
int check_stack(int v[])
{
int new_cap = M + 1;
Stack* ps = CreatStack();
Push(ps, 0);
int idx = 0;
int num = 1;
while (idx != N)
{
while (ps->Data[ps->top] < v[idx] && (ps->top+1) < new_cap&&idx != N)
Push(ps, num++);
if (ps->Data[ps->top] == v[idx])
{
Pop(ps);
idx++;
}
else
return 0;
}
return 1;
}
int main(void)
{
scanf("%d %d %d", &M, &N, &K);
int*v = (int*)malloc(sizeof(int)*N);
int i;
while (K--)
{
for(i = 0; i!= N; ++i)
scanf("%d",v+i);
if(check_stack(v))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
还有一点启示:声明一个数组可以用下述代码实现
int*v = (int*)malloc(sizeof(int)*N);
其中数组长度就是N。
数组名也就是头指针,原来是这个意思。这也是为什么代码
int check_stack(int v[])
可以这样写。新技能get。
由于自己比较菜,借鉴了别人的代码。哎。。。慢慢成长吧。