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

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

例如序列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.当栈中所有的元素均弹出的时候则说明出栈顺序序列与正好是入栈顺序序列对应的出栈顺序。否则出栈顺序与入栈顺序不匹配。

代码实现如下:

 #include <iostream>
#include <stack>
using namespace std; bool IsPopOrder(const int* pPush,const int* pPop,int nLength)
{
stack<int> S;
int p1=,p2=; while(p1<nLength)
{ if(pPush[p1]!=pPop[p2])
{
S.push(pPush[p1]);
p1++;
}
else
{
S.push(pPush[p1]);
S.pop();
p1++;
p2++;
} } while(p2<nLength)
{
if(pPop[p2]==S.top())
{
S.pop();
p2++;
}
else
{
return false;
}
} return true;
} int main()
{
int pPush[]={,,,,};
int pPop[];
int len=; cout<<"Please input the sequence of Out stack:\n";
for(int i=;i<len;i++)
{
int data=;
cin>>data;
pPop[i]=data; } if(IsPopOrder(pPush,pPop,len))
{
cout<<"The out sequence is right."<<endl;
}
else
{
cout<<"The out sequence is wrong."<<endl;
} return ;
}

运行截图:

剑指offer-面试题22.栈的压入,弹出序列的更多相关文章

  1. 剑指Offer:面试题22——栈的压入,弹出序列(java实现)

    题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

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

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  3. 剑指Offer - 九度1366 - 栈的压入、弹出序列

    剑指Offer - 九度1366 - 栈的压入.弹出序列2014-02-05 20:41 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所 ...

  4. 剑指offer(21)栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  5. 剑指offer二十一之栈的压入、弹出序列

    一.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  6. 【剑指offer】栈的压入弹出序列,C++实现(举例)

    原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为第一个序列的出栈序列.注意 ...

  7. 【剑指Offer】21、栈的压入、弹出序列

      题目描述:   输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2 ...

  8. 剑指offer - 栈的压入弹出序列 - JavaScript

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...

  9. 剑指Offer20 栈的压入弹出序列是否正确

    /************************************************************************* > File Name: 20_IsPopO ...

随机推荐

  1. CentOS6.4安装mplayer

    1.准备软件 mplayer官网:http://www.mplayerhq.hu/design7/news.html RPM Fusion网址:http://rpmfusion.org/ EPEL网址 ...

  2. vs2008工程配置

    一.添加H文件目录 依次点击“项目——配置属性——C/C++——常规”, 在“附加包含目录”中加入H文件所在的文件夹.(即项目所要用到的所有.h文件目录都要加进去)   二.添加LIB目录 1)依次点 ...

  3. 关于sem_unlink什么时候删除信号量

    sem_unlink在man手册里有这么一段话: sem_unlink() removes the named semaphore referred to by name. The semaphore ...

  4. Non-negative Partial Sums(单调队列)

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  5. iOS开发- 界面传值(1)-通知模式(广播)

    之后的几篇博客, 记录下不同界面间传值的经常使用办法. 这篇文章记录广播的方式. iOS的设计模式中,通知模式也是当中重要的模式之中的一个,Notification直译为通知,事实上本人认为叫做广播模 ...

  6. Lucene学习总结之五:Lucene段合并(merge)过程分析

    一.段合并过程总论 IndexWriter中与段合并有关的成员变量有: HashSet<SegmentInfo> mergingSegments = new HashSet<Segm ...

  7. 从Ecipse中导出程序至apk

    若未有数字证书: 1. 2. 3. 4. 5. 若已有数字证书: 上面的后3步改为

  8. 如何在jQuery中使用 setInterval,setTimeout

    当遇到setInterval,setTimeout与jquery混用的问题 时,直接按JavaScript中的语法写并不起作用,有以下两种解决方法. 方法1. 直接在ready中调用其他方法,会提示缺 ...

  9. BC 65 ZYB's Premutation (线段树+二分搜索)

    题目简述:有一个全排列,一直每个前缀区间的逆序对数,还原这个排列. fi记录逆序对数,pi记录该位置数值,则k=fi-f(i-1)表示前i-1个数比pi大的数的个数,那么只要在剩余元素求出按大小顺序第 ...

  10. 常见的SQL字符串函数

    1.LEN:计算字符串的长度(字符的个数) select len('哈哈hello') 返回长度为7 2.datalength();计算字符串所占用的字节数,不属于字符串函数 select DATAL ...