剑指offer-面试题22.栈的压入,弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第

二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1

是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该

该压栈序列的弹出序列。

 

 

这种判断其实只要掌握栈的先进后出原则,则不难解决。

本题的题解步骤如下:

1.设置一个辅助栈S,用于模拟出栈入栈顺序,设入栈顺序序列为pPush,出栈顺序序列为pPop

2.设置两个索引或指针分别指向入栈序列和出栈序列的第一个元素

3.顺序索引入栈元素,当入栈元素不等于出栈元素的时候,将入栈元素依次压入辅助栈S

4.当两者相等的时候,压入该元素到辅助栈S中同时将栈顶元素出栈,出栈入栈序列的索引均向后移动一个位置

5.当入栈序列索引结束之后,pPush剩余的元素全部已压入栈S

6.依次索引pPop如果pPop与辅助栈顶元素比较如果相等这将辅助栈顶弹出

7.当栈中所有的元素均弹出的时候则说明出栈顺序序列与正好是入栈顺序序列对应的出栈顺序。否则出栈顺序与入栈顺序不匹配。

 

代码实现如下:

 

 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4 
 5 bool IsPopOrder(const int* pPush,const int* pPop,int nLength)
 6 {
 7     stack<int> S;
 8     int p1=0,p2=0;
 9 
10     while(p1<nLength)
11     {
12 
13         if(pPush[p1]!=pPop[p2])
14         {
15             S.push(pPush[p1]);
16             p1++;
17         }
18         else
19         {
20             S.push(pPush[p1]);
21             S.pop();
22             p1++;
23             p2++;
24         }
25     
26     }
27 
28     while(p2<nLength)
29     {
30         if(pPop[p2]==S.top())
31         {
32             S.pop();
33             p2++;
34         }
35         else
36         {
37             return false;
38         }
39     }
40 
41     return true;
42 }
43 
44 int main()
45 {
46     int pPush[5]={1,2,3,4,5};
47     int pPop[5];
48     int len=5;
49 
50     cout<<"Please input the sequence of Out stack:\n";
51     for(int i=0;i<len;i++)
52     {
53         int data=0;
54         cin>>data;
55         pPop[i]=data;
56 
57     }
58 
59     if(IsPopOrder(pPush,pPop,len))
60     {
61         cout<<"The out sequence is right."<<endl;
62     }
63     else
64     {
65         cout<<"The out sequence is wrong."<<endl;
66     }
67 
68     return 0;
69 }

 

运行截图:

 

 

转载于:https://www.cnblogs.com/vpoet/p/4675945.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值