参考思路博客(我认为最简洁,但他代码略显复杂)
https://blog.youkuaiyun.com/solitarycccc/article/details/102874048
首先看题
题目大致意思
有一段从1开始到N的连续的数 ,可以通一个大小为M的栈弹出,形成上述顺序的输出,给定K组测试数据,注意所有的数必须通过栈来弹出,如样例第五个,6>5,不可以理解为栈里放5个数(2~6),7直接不入栈输出。坑了我好久。
思路:用数组模拟一个栈,如果栈顶的数等于输入的数(假设为n),栈顶数出栈,top--;如果不等于,则一直入栈,从1开始的数,直到栈顶数为n或者栈满。
以第五测试样例为例。
刚开始栈为空,top指向0,初始化Stack[top]==0;接收n=1,Satck【top】!=1;入栈从(1开始的到7自然数),top++,变为1;Stack【1】==1==n;top--,top=0;接收n=7,Stack【top】==0!=7,一直入栈,此处省略,Stack【5】=6;top==5;还是不等于7,但是栈已满,不行,为NO。
代码如下
#include <iostream>
using namespace std;
int Stack[1005] = { 0 };
int top = 0;
int M, N;
int Judge(int* Stack)
{
top = 0;
int n;
int j = 1;
int flag = 1;
for (int i = 1; i <= N; i++)
{
scanf("%d", &n);
if (Stack[top] != n)//栈顶不等于n
{
while (Stack[top] != n&&top<M)//一直入栈直到栈顶等于n,或者栈满
{
top++;
Stack[top] = j;
j++;
}
if (Stack[top] != n)//如果是栈满,凉凉,结果为No
flag = 0;
else//如果栈顶等于n,出栈
top--;
}
else//栈顶相等出栈
{
top--;
}
}
return flag;
}
int main()
{
int T;
cin >> M >> N >> T;
for (int k = 1; k <= T; k++)
{
if (Judge(Stack))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}