#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stack>
using namespace std;
//5 7 5 1 2 3 4 5 6 7 3 2 1 7 5 6 4 7 6 5 4 3 2 1 5 6 4 3 7 2 1 1 7 6 5 4 3 2
stack<int>s;
int main()
{
int* a;
int m, n, k;
scanf("%d%d%d", &m, &n, &k);// != EOF)
a = (int*)malloc((n + 1) * sizeof(int));
a[0] = 0;
for (;k > 0;k--){
while (!s.empty())s.pop();
for (int i = 0;i < n;i++)scanf("%d", &a[i]);
int i = 0,j = 0;
while (i < n)
{
while ((s.empty() || s.top() != a[i]) && j < n&&s.size() < m)
{
s.push(j + 1);
j++;
}
if (s.top() == a[i])
{
s.pop();
i++;
}
else break;
}
if (s.empty())printf("YES\n");
else printf("NO\n");
}
system("pause");
return 0;
}
我们使用VS2015和相应的C++编译器。使用C++的stack头文件:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stack>
using namespace std;
#define _CRT_SECURE_NO_WARNINGS 是为了使用老的scanf函数使用的,其实用cin cout更好。
在主函数里面定义指针a,并用malloc根据输入的m,n,k来分配空间
int* a;
int m, n, k;
scanf("%d%d%d", &m, &n, &k);// != EOF)
a = (int*)malloc((n + 1) * sizeof(int));
a[0] = 0;
定义一个大循环,循环k次:
for (;k > 0;k--){
}
在大循环内部,首先应该把我们定义的栈 s 全部弹出:
while (!s.empty())s.pop();
for (int i = 0;i < n;i++)scanf("%d", &a[i]);
int i = 0,j = 0;
输入数据,然后开始循环。注释都在程序里
while (i < n) //i 用来遍历输出数据
{
//当j<n,说明这N个数还没有全都进栈
//s.size()<m,说明栈还没有满,可以继续往里面push
//还得保证栈里面的第一个数据不是我们当前需要的(正如前面的分析)
//当栈是空的,没法弹出(作为输出)也是不行的,也得进行push
while ((s.empty() || s.top() != a[i]) && j < n&&s.size() < m)
{
s.push(j + 1);
j++;
}
//如果top元素正好是我们需要输出的,就输出。如果不是,那只有两种情况,要么已经都输出完了,要么这个序列不可能
if (s.top() == a[i])
{
s.pop();
i++;
}
else break;
}
然后判断栈是不是空的。如果是,说明都顺利弹出去了。否则说明有东西留了下来,则表明
该输出序列是不可能的
if (s.empty())printf("YES\n");
else printf("NO\n");
来源:CSDN
作者:Dezeming
链接:https://blog.csdn.net/tiao_god/article/details/104509447