题目:输入两个整数序列。其中一个序列表示栈的push 顺序,
判断另一个序列有没有可能是对应的pop 顺序。
为了简单起见,我们假设push
序列的任意两个整数都是不相等的。
比如输入的push 序列是1、2、3、4、5,那么4、5、3、2、1 就有可能是一个pop 系列。
思路:建立一个栈,若栈不为空,检查栈顶元素是否与pop序列将要弹出的元素相同,若相同则弹出栈顶元素,若不同,则检查push序列,将push序列中将与pop序列将要弹出元素不同的全部压入栈,直到找到相同的,若在push剩下的元素中找不到与pop序列将要弹出的元素相同的元素,则这个pop序列不可能是push序列的一个弹出序列,循环下去,直到pop序列完成,或肯定了pop不是朴实的一个出栈顺序。
基于以上分析,代码如下:
1 bool IsPopSeries(int *push, int *pop, int n) 2 { 3 assert (push != NULL); 4 5 assert (pop != NULL); 6 7 assert (n > 0); 8 9 int *Stack = NULL; 10 int nTop = -1; 11 12 if (NULL == (Stack = (int *)malloc (n * sizeof (int)))) 13 { 14 printf ("Fail to malloc space to Stack!\n"); 15 exit(1); 16 } 17 18 int i = 0; 19 int j = 0; 20 21 while (j < n) 22 { 23 if (nTop >= 0) 24 { 25 // 若栈不为空则首先检查栈顶元素是否符合要求 26 if (Stack[nTop] == pop[j]) 27 { 28 --nTop; 29 ++j; 30 31 continue; 32 } 33 } 34 35 while ((i < n) && (push[i] != pop[j])) 36 { 37 // 在push序列中找下一个要弹出的元素 38 Stack[++nTop] = push[i++]; 39 } 40 41 if (i >= n) 42 { 43 // push序列找完了都没有找到pop序列中将要弹出的元素 44 // 则pop不可能是push的弹出序列 45 break; 46 } 47 48 ++i; 49 ++j; 50 } 51 52 if (j < n) 53 { 54 return (false); 55 } 56 57 return true; 58 }