这道题一次就全AC,太爽辣
(编译错误可能是因为不能提前声名函数,把后面的函数全放前面就可以)
题目
题目意思很好理解,大体就是判断一个先入后出的堆栈,能不能得到以下的输出结果。
第一行有三个数据:
栈的大小 判断数据的数量 判断几次
之后每行就输入你要判断的输出的数据。
例如1,2,3顺序入栈,你能控制输入输出的时间,得到123,321,213等数据,得不到312。
代码分析
简单分为3个部分,输入,判断,输出。
我们每输入完一次数据,就进行一次判断,得出结果并输出。
主函数
#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
typedef struct SNode* Stack;
struct SNode
{
int Data[MAX];
int Top;
};
int Judge(int *a, int n, int time);
int Push(int i, int max, Stack Ptrl);
int Pop(Stack Ptrl);
int main()
{
//表示栈的大小,数据总数,判断次数
int max, n, time;
int i, j, flag;
int a[MAX];//存储输入数据
scanf("%d %d %d", &max, &n, &time);
for (i = 0; i < time; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[i]);
}
flag = Judge(a, max, n, time);//判断函数
if (flag == 1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
入栈、出栈函数
学了堆栈的应该都懂,就不细讲了。
//入栈
int Push(int i, int max, Stack Ptrl)//i是入栈的数据,max是堆栈大小
{
if (Ptrl->Top + 1 != max)//判断栈是否存满
{
Ptrl->Data[++(Ptrl->Top)] = i;
return 1;
}
else//如果栈满了
return 0;
}
//出栈
int Pop(Stack Ptrl)
{
return Ptrl->Data[Ptrl->Top--];
}
判断函数
第一步我们把数字1入栈。
之后进入循环,如果遍历了一遍输入的数据a[ j ],就停止循环,因为遍历中每一个数都得到实现,说明能得到这样的结果,所以return 1.
循环中有3种情况。
1、a[ j ] = 刚入栈的数
让这个数出栈,之后j++,a[ j ]挪到下一位。
2、a[ j ] > 刚入栈的数
说明还没到输出机会,再入栈一个数
3、a[ j ] < 刚入栈的数
说明无法出栈,此时这个出栈方法就不能实现,直接return 0.
int Judge(int* a, int max, int n, int time)
{
int flag;
int j = 0, i = 1, t;//i表示入栈的数
Stack Ptrl = (Stack)malloc(sizeof(struct SNode));
Ptrl->Top = 0;//把1入栈
Ptrl->Data[Ptrl->Top] = i;
i++;
while (j != n)
{
if (a[j] > Ptrl->Data[Ptrl->Top])//大于情况
{
flag = Push(i, max, Ptrl);
if (flag == 0)//栈满了,说明该方法不成立
return 0;
i++;
}
else if (a[j] == Ptrl->Data[Ptrl->Top])//等于情况
{
t = Pop(Ptrl);
j++;
}
else//小于情况
{
return 0;
}
}
free(Ptrl);
return 1;
}
代码实现
#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
typedef struct SNode* Stack;
struct SNode
{
int Data[MAX];
int Top;
};
int Judge(int *a, int n, int time);
int Push(int i, int max, Stack Ptrl);
int Pop(Stack Ptrl);
int main()
{
int max, n, time;
int i, j, flag;
int a[MAX];
scanf("%d %d %d", &max, &n, &time);
for (i = 0; i < time; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[j]);
}
flag = Judge(a, max, n, time);
if (flag == 1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
int Push(int i, int max, Stack Ptrl)
{
if (Ptrl->Top + 1 != max)
{
Ptrl->Data[++(Ptrl->Top)] = i;
return 1;
}
else
return 0;
}
int Pop(Stack Ptrl)
{
return Ptrl->Data[Ptrl->Top--];
}
int Judge(int* a, int max, int n, int time)
{
int flag;
int j = 0, i = 1, t;//i表示入栈的数
Stack Ptrl = (Stack)malloc(sizeof(struct SNode));
Ptrl->Top = 0;//把1入栈
Ptrl->Data[Ptrl->Top] = i;
i++;
while (j != n)
{
if (a[j] > Ptrl->Data[Ptrl->Top])
{
flag = Push(i, max, Ptrl);
if (flag == 0)//栈满了,说明该方法不成立
return 0;
i++;
}
else if (a[j] == Ptrl->Data[Ptrl->Top])
{
t = Pop(Ptrl);
j++;
}
else
{
return 0;
}
}
free(Ptrl);
return 1;
}