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;
}
}
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#