您的位置:首页 > 运维架构

栈的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序列。

代码如下:

#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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: