1051 Pop Sequence (25 point(s))
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 个数按照 1, 2, 3, …, N 的顺序入栈,判断所给 K 个序列是否为出栈顺序,是输出 “YES”,否输出 “NO”
设计思路:
栈的模拟,对于每个出栈序列:
- 每读取到一个出栈数字,则将此数字及小于此数字的数入栈,入栈需满足:
- 栈顶 top 不能超过容量 M
- count 表示入栈数字 1, 2, 3, …, N 应小于等于 N
- 栈顶元素小于读取到的出栈数字 num,则说明 count 表示的数字还未入栈
- 栈顶元素等于读取到的出栈数字,则栈顶出栈,读取下一个出栈数字继续判断
- 若不能出栈,则读取剩余出栈元素并结束循环
- 栈中元素为空输出 “YES”,否则输出 “NO”
编译器:C (gcc)
#include <stdio.h>
int main(void)
{
int m, n, k;
int stack[1000] = {-1}, top = 1;
int i, j, num, count;
scanf("%d %d %d", &m, &n, &k);
for (i = 0; i < k; i++) {
top = 1;
count = 1;
for (j = 0; j < n; j++) {
scanf("%d", &num);
while (top <= m && count <= n && stack[top - 1] < num) {
stack[top] = count;
count++;
top++;
}
if (stack[top - 1] == num) {
top--;
} else {
scanf("%*[^\n]");
break;
}
}
if (top > 1) {
printf("NO\n");
} else {
printf("YES\n");
}
}
return 0;
}