棧的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
}