ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目:输入两个整数序列。其中一个序列表示栈的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 }
posted on 2013-05-03 11:22  ldjhust  阅读(246)  评论(0编辑  收藏  举报