# #数据结构与算法学习笔记#PTA7：出栈序列检验（C/C++）

252 篇文章 1 订阅
80 篇文章 0 订阅
20 篇文章 3 订阅

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.

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

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一秒钟。留个言点个赞呗，谢谢你#

• 2
点赞
• 0
收藏
觉得还不错? 一键收藏
• 0
评论
03-29
02-20 868
11-22
09-15
10-16 2441
11-08 578
03-26 270
05-17 946
04-17 1482

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。