题目:输入两个整数序列。其中一个序列表示栈的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。
比如输入的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序列。
思路:个人的解决方法是按照push和pop的序列来构造一个堆栈,如果构造过程中,不满足条件,那么就返回false
#include <iostream>
using namespace std;
bool ifPopMatchPush(int *aPush, int *bPop, int n)
{
vector<int> vInt;
int i = 0, j = 0;
for(; i < n && j < n; i ++)
{
if(aPush[i] != bPop[j])
{
vInt.push_back(aPush[i]);
}
else
{
while(1)
{
j ++;
if(j >= n)
{
return true;
}
if(vInt.back() == bPop[j])
{
vInt.pop_back();
}
else
{
break;
}
}
}
}
if(i == n || i != j)
return false;
else
return true;
}
int main(int argc, char *argv[])
{
int a[5]={1,2,3,4,5};
int b[5]={4,3,5,1,2};
int c[5]={5,4,3,2,1};
cout << "a and b " << ifPopMatchPush(a, b, 5) << endl;
cout << "a and c " << ifPopMatchPush(a, c, 5) << endl;
return 0;
}