栈的push、pop序列
2012-09-07 16:24
609 查看
栈的push、pop序列
输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。(寻找矛盾体)
分析:首先建立一个辅助栈s,遍历pop序列中的元素p(i)。
首先判断辅助栈s是否为空,如果s为空,则在push序列中查找p(i)的位置,此时一定可以在push序列中找到p(i),然后将push序列中在该位置之前的元素全部push到辅助栈中,并且将这些元素标记为已push,然后继续遍历pop序列。
如果s不为空,则比较栈顶元素和p(i)是否相等,如果相等则直接弹出,继续遍历pop序列;如果不相等则在push序列中查找p(i)的位置,如果没有查找到,则说明不可能有这样的pop序列,如果找到,则将push序列中在该位置之前的元素全部push到辅助栈中,并且将这些元素标记为已push,然后继续遍历pop序列。
代码如下:
输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。(寻找矛盾体)
分析:首先建立一个辅助栈s,遍历pop序列中的元素p(i)。
首先判断辅助栈s是否为空,如果s为空,则在push序列中查找p(i)的位置,此时一定可以在push序列中找到p(i),然后将push序列中在该位置之前的元素全部push到辅助栈中,并且将这些元素标记为已push,然后继续遍历pop序列。
如果s不为空,则比较栈顶元素和p(i)是否相等,如果相等则直接弹出,继续遍历pop序列;如果不相等则在push序列中查找p(i)的位置,如果没有查找到,则说明不可能有这样的pop序列,如果找到,则将push序列中在该位置之前的元素全部push到辅助栈中,并且将这些元素标记为已push,然后继续遍历pop序列。
代码如下:
#include "stdafx.h" #include "stdlib.h" #include <iostream> #include <string> #include <stack> using namespace std; //查找元素在数组指定起始范围内的位置 int IndexOfPushArray(int *pushArray,int start,int n,int val) { for (int i=start;i<n;i++) { if (pushArray[i]==val) return i; } return -1; } //检查是否可能有这样的pop序列 bool IsPossiblePop(int *pushArray,int *popArray,int n) { //index1记录popArray[i]在pushArray中的位置,index2记录popArray[i+1]在pushArray中的位置 int i,j,index1=-1,index2; stack<int> s; //辅助栈 for (i=0;i<n;i++) { //s为空,在pushArray中查找 if (s.empty()) { index1++; index2=IndexOfPushArray(pushArray,index1,n,popArray[i]); if (index2!=-1) { for (j=index1;j<index2;j++) { s.push(pushArray[j]); } index1=index2; } } //s不为空时,在pushArray中查找 else { //栈顶元素等于popArray[i],直接弹出 if (s.top()==popArray[i]) { s.pop(); } //栈顶元素不等于popArray[i],继续在pushArray中查找 else { index1++; index2=IndexOfPushArray(pushArray,index1,n,popArray[i]); if (index2!=-1) //查找成功 { for (j=index1;j<index2;j++) { s.push(pushArray[j]); } index1=index2; } else //未查找到 return false; } } } return true; } void main() { int a[]={1,2,3,4,5}; int b1[]={4,5,3,2,1}; int b2[]={4,3,5,1,2}; cout<<IsPossiblePop(a,b1,5)<<endl; //1 cout<<IsPossiblePop(a,b2,5)<<endl; //0 }
相关文章推荐
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的
- 栈的push、pop序列[数据结构]
- 程序员面试题精选100题(24)-栈的push、pop序列
- 数据结构练习(19)栈的push、pop序列
- 面试题14 - 栈的 push, pop 序列 【栈】
- 栈的push、pop序列
- 栈的push、pop序列-判断序列是否是栈的pop顺序
- 29.栈的push、pop 序列
- 24.栈的push和pop序列[StackPushPopSequence]
- 程序员面试题精选100题(24)-栈的push、pop序列
- (栈)栈 给定push序列,判断给定序列是否是pop序列
- 29. 栈的push,pop序列
- 谈谈如何判断一个Pop序列是否是一个Push序列的Pop顺序
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序
- 程序员面试题精选100题(24)-栈的push、pop序列
- 29.栈的push、pop序列
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的
- 栈的push、pop序列-实现
- 剑指Offer---面试题22:栈的push,pop序列问题
- 程序员面试题100题第24题——判断是否是push、pop序列