算法 PAT真题 Pop Sequence 分析思路以及实现 2

烂漫一生 提交于 2020-02-26 10:33:01
#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");

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!