這是PAT上的一道題,用c++簡單些,因爲要用到堆棧(stack), 我用c語言寫了個, 如果有簡單的思路, 希望大家提示
#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
int a[MAX];
typedef struct SNode{
int *m;
int top;
} *Stack;
void Push(Stack PtrS, int x);
void Pop(Stack PtrS);
Stack createStack()
{
Stack PtrS = (Stack)malloc(sizeof(struct SNode));
PtrS->m = (int *)malloc(sizeof(int)*MAX);
PtrS->top = -1;
return PtrS;
}
int main()
{
int M, N, K, start, flag;
scanf("%d%d%d", &M, &N, &K);
Stack PtrS = createStack(); // 一個堆棧
while(K--) // 3 2 1 7 5 6 4
{ start = 0; flag = 1;
for(int i = 0; i < N; i++)
scanf("%d", &a[i]); // 讀入一組數據
//printf("test\n");
PtrS->top = -1;
for(int i = 0; i < N; i++)
{ //printf("test\n");
if(PtrS->m[PtrS->top] > a[i] && PtrS->top != -1)
{
flag = 0; break;
}
if(PtrS->top == -1 || PtrS->m[PtrS->top] < a[i])
{ //printf("test\n");
for(int j = start+1; j <= a[i] && PtrS->top < M-1; j++)
{
Push(PtrS, j); start++;
}
}
if(PtrS->top == M-1 && PtrS->m[PtrS->top] != a[i])
{
flag = 0; break;
}
Pop(PtrS);
}
printf("%s\n", flag == 1 ? "YES" : "NO");
}
return 0;
}
// 進棧
void Push(Stack PtrS, int x)
{
if(PtrS->top == MAX-1)
return;
PtrS->m[++PtrS->top] = x;
}
// 出棧
void Pop(Stack PtrS)
{
if(PtrS->top == -1)
return;
PtrS->top--;
}