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; } } }