7-3 Pop Sequencehttps://pintia.cn/problem-sets/16/problems/665
第一遍做时,为了比较严谨好看,把栈做成了内存动态分配+结构体的形式,类似的还有一个pop序列和对应指针等变量,结果把我给搞晕了,中间有个样例会溢出导致异常,头昏脑胀半天没找出bug。 后来直接重构了代码,栈和pop序列都用了简单的int数组,并且第二遍做的时候思路也更清晰了一点,比较快做完了。
思路比较简单:按照1,2,3,……,n的顺序不断push进栈中,每次push完检测栈顶元素是否和当前pop序列中元素相等(相等就说明该序列是可行的),如果是,就不断pop弹出,然后继续push进栈。这个过程中如果栈满了,那么直接跳出循环。 循环结束后,检测栈和pop序列是否为空,如果是,说明这个序列是一个可能的栈弹出序列(”is a possible pop sequence of the stack.”),输出”YES”。反之如果还有元素,说明不能该序列是不可能的,输出”NO”。
出错点:
栈顶元素可能连续多个和pop序列中元素相等,因此应当用while循环检测是否相等(而不是if语句)。每次相等时,pop指针+1,栈指针-1。
k个循环每个循环都是独立的、全新的,因此都要重新初始化pop序列和栈。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 #include <stdio.h> #include <string.h> #include <stdlib.h> int stack[1003 ], stackNow = -1 ;int size () { return stackNow + 1 ; } int top () { if (size () > 0 ) { return stack[stackNow]; } else return -1 ; } void pop () { if (size () > 0 ) --stackNow; } void push (int a) { stack[++stackNow] = a; } int main () { int m, n, k; int seq[1003 ], seqNow = 0 ; scanf ("%d %d %d" , &m, &n, &k); while (k--) { seqNow = 0 ; stackNow = -1 ; for (int i = 0 ; i < n; i++) scanf ("%d" , &seq[i]); int num = 1 ; while (num<(n + 1 )) { stack[++stackNow] = num++; if (size () >m) break ; while (size ()>0 && seq[seqNow] == top ()) { seqNow++; pop (); } } if (num== (n + 1 ) &&size ()== 0 ) printf ("YES\n" ); else printf ("NO\n" ); } return 0 ; }