码迷,mamicode.com
首页 > 其他好文 > 详细

栈的压入、弹出序列

时间:2016-06-27 15:24:01      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

题目:判断一数字序列是否为这些数字入栈的一种出栈方式(前提:栈中的数字不重复)

思路1:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列还没有入栈的数字压入辅助栈,知道把下一个要弹出的数字压入栈顶为止。如果所有的数字都压入了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。

思路2:开辟一个辅助栈,模拟入栈出战过程(假设pa为入栈序列,pb为出战序列),pA中的元素依次压入辅助栈,新压入的元素与弹出序列的栈底相同,辅助栈弹出,同时pB向上移动,不相同了pB中的元素继续入辅助栈。

 1 #include "stdafx.h"
 2 #include <stack>
 3 
 4 //方法1 
 5 bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
 6 {
 7     bool bPossible = false;
 8     
 9     if(pPush != NULL && pPop != NULL && nLength > 0)
10     {
11         const int* pNextPush = pPush;
12         const int* pNextPop = pPop;
13         
14         std::stack<int> stackData;
15         
16         while(pNextPop - pPop < nLength)
17         {
18             // 当辅助栈的栈顶元素不是要弹出的元素
19             // 先压入一些数字入栈
20             while(stackData.empty() || stackData.top() != *pNextPop)
21             {
22                 // 如果所有数字都压入辅助栈了,退出循环
23                 if(pNextPush - pPush == nLength)
24                     break;
25                 
26                 stackData.push(*pNextPush);
27                 
28                 pNextPush ++;
29             }
30             
31             if(stackData.top() != *pNextPop)
32                 break;
33         
34             stackData.pop();
35             pNextPop ++;
36         }
37         
38         if(stackData.empty() && pNextPop - pPop == nLength)
39             bPossible = true;
40     }
41     
42     return bPossible;
43     
44 }
45 
46 //方法2 
47 bool IsPopOrder1(const int* pPush, const int* pPop, int lengthA, int lengthB)
48 {
49     if( lengthA != lengthB || lengthA == 0)
50         return false;
51     bool flag = false;
52 
53     int pA =0;
54     int pB =0;
55     int *newpPush = new int[lengthA];
56     int top = -1;
57     for(pA = 0 ; pA < lengthA; ++pA)
58     {
59         ++top;
60         newpPush[top] = pPush[pA];
61         while(newpPush[top] == pPop[pB])
62         {
63             --top;
64             ++pB;
65         }
66     }
67     if(top == -1)
68         flag = true;
69     delete []newpPush;
70     return flag;
71 }
72 
73 int main()
74 {
75     const int nLength = 5 ;
76     int push[nLength] = {1,2,3,4,5};
77     int pop[nLength] = {4, 5, 3, 2, 1};
78     
79     bool  flag1 = IsPopOrder(push, pop, nLength);
80     printf("Solution 1 is %d\n", flag1 );
81     
82     bool  flag2 = IsPopOrder1(push, pop, nLength, nLength);
83     printf("Solution 2 is %d", flag2 );
84     return 0;
85 }

技术分享

 

栈的压入、弹出序列

标签:

原文地址:http://www.cnblogs.com/sankexin/p/5619996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!