栈的push、pop 序列

题目:输入两个整数序列。其中一个序列表示栈的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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/ldjhust/archive/2013/05/03/3056307.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值