线性结构4 Pop Sequence(25 分)
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.
Sample Input:
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
Sample Output:
YES
NO
NO
YES
NO
题目的意思是:
1. 有一个堆栈限制大小为M , 测试K组数据数列, 每组数列的长度是N;
2. 以1,2,3…N的顺序往队列压数据,可以随时pop处理;判断是否pop出来的数据的顺序和我们给的数列(长度也是N)是否相同;相同YES,不相同NO;
3. 一个测试K组:
以下是用C++完成
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stack>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int M;//Max of stack 5
int N;//length of push sequence 7
int K;//num of pop sequence to be check
cin>>M>>N>>K;
stack<int> sta;
int v;
int flag = true;
int tmp;
for(int i=0;i<K;i++)
{
flag = true;
tmp = 1;
for(int j =0;j<N;j++)
{
cin>>v; //一定要输完的
while(flag&&sta.size()<=M){
if(sta.size()==0||sta.top()!=v){//放入
sta.push(tmp++);
} else if(sta.top()==v){//顶部相同
sta.pop();//推出一个后应该指针 转到下一个
break;
}
}
if(sta.size()>M){
flag= false;
}
}
if(flag){
printf("YES\n");
}else{
printf("NO\n");
}
while(!sta.empty())
sta.pop();
}
return 0;
}