1051 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、如何模拟随机弹出?
2、自己想的思路——打表法,通过递归的方式,将所有组合统计出来,然后一一判断,但自己不知道如何递归出来
参考算法笔记思路和代码完成该题,在该题中有一个规律,就是通过判断栈顶元素与当前数组中的元素是否相同,这个方法自己没有想到,自己对栈的使用方法有了更深的认识
#include<iostream>
#include<stack>
using namespace std;
int main(){
int M, N, K;
scanf("%d%d%d", &M, &N, &K);
//初始化栈
stack<int> st;
while (K--)
{
//栈清空
while (!st.empty())
{
st.pop();
}
//输入要判定的元素
int arr[1001];
for (int i = 1; i <= N; i++)
{
scanf("%d", &arr[i]);
}
int flag = true;
int current = 1;//指向要检测的序列
for (int i = 1; i <= N; i++)
{
st.push(i);//入栈
//判断栈使用空间是否已超过规定空间
if (st.size()>M)
{
flag = false;
break;
}
//栈不为空,且当前元素等于栈顶元素,则出栈
while (!st.empty()&&st.top()==arr[current])
{
st.pop();
current++;//指向序列的下一个元素
}
}
//没有超过空间,且栈为空,说明序列存在
if (flag==true&&st.empty())
{
printf("YES\n");
}else
{
printf("NO\n");
}
}
system("pause");
return 0;
}