原题:
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
分析
第一行输入栈大小M, 入栈序列长度N, 要检查出栈序列的个数K,入栈序列已经给出为1, 2, 3, …, N,接下来再判断输入的K个的出栈序列是否合理
先生成一个入栈序列保存在数组arr中,读入出栈序列保存在数组input中,之后用while循环开始入栈,每入栈一个元素就判断一次是否栈满,若栈满则直接break,接着再用一次while出栈(当栈顶元素与出栈元素相同时,且栈不为空即栈下标si>=0时出栈)。跳出入栈循环有两种情况,一个是栈满,栈下标si>栈大小m-1,另一个就是入栈完了,此时还要再检查一下出栈序列有没有遍历完,即栈内是否还有元素没有出栈,若没有则说明这样的出栈序列也是无法实现的
C语言完整代码如下
#include <stdio.h>
/* 02-线性结构4 Pop Sequence (25分) */
#define MAX 1000
int main(void)
{
int arr[MAX], stack[MAX], input[MAX];
int m, n, k, ai = 0, si = 0, ii = 0; /* ai, si, ii分别是数组arr, stack, input的下标 */
scanf("%d %d %d", &m, &n, &k);
for(int i = 1; i <= n; i++) /* 按题目要求生成一个入栈顺序数组1到N */
arr[i-1] = i;
for(int j = 0; j < k; j++)
{
ai = 0;
si = -1; /* 这里stack下标初始化为-1是因为在下方进入while循环中会先+1 */
ii = 0;
for(int i = 0; i < n; i++)
scanf("%d", &input[i]);
while(ai < n)
{
si++;
stack[si] = arr[ai++];
if (si > m - 1) /* 判断是否栈满 */
break;
while(stack[si] == input[ii] && si >= 0) /* 出栈 */
{
si--;
ii++;
}
}
if (si > m - 1 || ii != n)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}