Given a stack which can keep MM numbers at most. Push NN numbers in the order of 1, 2, 3, ..., NN 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 MM is 5 and NN is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.
Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): MM (the maximum capacity of the stack), NN (the length of push sequence), and KK (the number of pop sequences to be checked). Then KK lines follow, each contains a pop sequence of NN numbers. All the numbers in a line are separated by a space.
For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.
NO
/* * 举个例子吧: 3 2 1 7 5 6 4是不可能的序列 因为3第一个出栈 1,2必定还在栈中 321是可能的 但是7先进栈 4,5,6还在栈中 4先进栈 所以出栈顺序该是6 5 4故不可能 从左往右扫描数组 得到t 维护MIN值 如果t比MIN大 则将MIN+1-t-1的值进栈 小的话 则出栈一个和t比较 不相等则不可能,相等则继续 另外 栈中元素个数如果超过栈容量 则也不可能得到 */ #include "iostream" using namespace std; #define MAXSIZE 1000 typedef int ElementType; struct Node { ElementType data[MAXSIZE]; int top; }; typedef Node *ptrToNode; typedef ptrToNode Stack; /* 初始化栈 */ void initStack(Stack *stack) { *stack = (Stack)malloc(sizeof(Node)); (*stack)->top = -1; } /* 进栈 */ bool push(Stack *stack, ElementType ele) { if ((*stack)->top == MAXSIZE - 1) return 0; (*stack)->top++; (*stack)->data[(*stack)->top] = ele; return 1; } /* 出栈 */ ElementType pop(Stack *stack) { if ((*stack)->top == -1) return 0; return (*stack)->data[(*stack)->top--]; } ElementType length(Stack *stack) { return (*stack)->top + 1; } int main() { int k, m, n; int a; int min = 0; Stack s; bool flag = true; cin >> k >> m >> n; while (n--) { flag = true; initStack(&s); int l = m; min = 0; while (l--) { cin >> a; if (a > min) { for (int i = min + 1; i < a; i++) //先弹出的a,所以min-(a-1)的数 应按顺序在栈中 push(&s, i); min = a; } if (length(&s) > k - 1) flag = false; if (a < min) { int b = pop(&s); if (a != b) { flag = false; } } } if (flag) cout << "YES" << endl; else cout << "NO" << endl; } }