#数据结构与算法学习笔记#PTA7:出栈序列检验(C/C++)

2018.3.27

Pop Sequence

Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.


Input Specification:
Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.

Output Specification:

For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.


给定一个堆栈的容量M、入栈序列的长度N,待检验出栈序列个数K,限定入栈顺序必按1、2、3……,出栈顺序随机。输入K个待检验序列(长度=N),判断在限定栈容量M下,出栈序列是否成立。

总的思路是模拟入栈和出栈,若栈顶元素小于当前序列元素,顺序元素入栈;若栈顶元素等于当前,进行出栈操作。为待检验序列建立一个指示器,若条件范围内序列指示器能够走完,则说明序列成立。

// PopSequence.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stack>
#include <vector>

using namespace std;

#define MAX 1000

void Read(int &pushLength, int& popNum, vector<vector<int>> &data);
void Check(int &maxCap, int &pushLength, vector<vector<int>> &data, vector<bool> &output);
void Print(int& popNum, vector<bool> &output);

int main()
{
	int maxCap;
	int pushLength;
	int popNum;
	cin >> maxCap >> pushLength >> popNum;

	vector<vector<int>> data;
	vector<bool> output;

	Read(pushLength, popNum, data);
	Check(maxCap, pushLength, data, output);
	Print(popNum, output);

	system("pause");
	return 0;
}

void Read(int &pushLength, int& popNum, vector<vector<int>> &data) {

	for (int i = 0; i < popNum; i++) {
		vector<int> squ;
		int element;
		for (int j = 0; j < pushLength; j++) {
			cin >> element;
			squ.push_back(element);
		}
		data.push_back(squ);
	}
}

void Check(int &maxCap, int &pushLength, vector<vector<int>> &data, vector<bool> &output) {	
	for (int i = 0; i < data.size(); i++) {
		stack<int> popSeq;
		int pushnum = 1;	//顺序元素计数器
		int seqpoint = 0;	//入栈序列指示器

		while (pushnum <= pushLength) {
			//若栈顶元素小于当前序列元素,顺序元素入栈
			if (popSeq.empty() || popSeq.top() < data[i][seqpoint]) {
				popSeq.push(pushnum);
				if (popSeq.size() > maxCap)break;		//若栈超限,跳出循环
				pushnum++;
			}
			//若栈顶元素等于当前序列元素,出栈操作,入栈序列指示器后移一位
			else if (popSeq.top() == data[i][seqpoint]) {
				popSeq.pop();
				seqpoint++;
			}
			//若栈顶元素大于当前元素,跳出循环
			else if(popSeq.top() > data[i][seqpoint]){
				break;
			}
		}

		//若顺序元素全部入栈完成而栈不空,则进行收尾工作,依次出栈验证
		while (pushnum > pushLength && popSeq.empty() == false) {
			if (popSeq.top() == data[i][seqpoint]) {
				popSeq.pop();
				seqpoint++;
			}
			else{
				break;
			}
		}

		//根据入栈序列指示器有没有走完判断是否通过
		if (seqpoint == pushLength) {
			output.push_back(true);
		}
		else {
			output.push_back(false);
		}
	}
}

void Print(int& popNum, vector<bool> &output) {
	for (int i = 0; i < popNum; i++) {
		if (output[i] == true) {
			cout << "YES" << endl;
		}
		else {
			cout << "NO" << endl;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_20304723/article/details/79719260