题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
判断一个序列是否是某个栈的弹出顺序的步骤是:
(1)如果下一个弹出的数字刚好再栈顶,那么弹出该数字;
(2)如果下一个要弹出的数字不在栈顶,则在带压栈的数据中压入数据直到压入要弹出的数据停止;
(3)如果所有的数据都已压入栈内,但是下一个要弹出的数字不在栈顶,那么该数字不可能是该栈的一个弹出序列。
具体步骤如下图所示:
假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
判断一个序列是否是某个栈的弹出顺序的步骤是:
(1)如果下一个弹出的数字刚好再栈顶,那么弹出该数字;
(2)如果下一个要弹出的数字不在栈顶,则在带压栈的数据中压入数据直到压入要弹出的数据停止;
(3)如果所有的数据都已压入栈内,但是下一个要弹出的数字不在栈顶,那么该数字不可能是该栈的一个弹出序列。
具体步骤如下图所示:
具体实现代码如下:
#include <iostream>
#include <stack>
using namespace std;
int arr1[5]={1,2,3,4,5};
int arr2[5]={4,5,3,2,1};
int arr3[5]={4,3,5,1,2};
bool IsPopOrder(const int *pPush,const int *pPop,int length)
{
bool bPossible=false;
if(pPush!=NULL && pPop!=NULL && length>0)
{
const int *PopNext=pPop;
const int *PushNext=pPush;
stack <int> s;
while(PopNext-pPop < length)
{
while(s.empty() || s.top()!=*PopNext)
{
if(PopNext-pPop==length)
break;
s.push(*PushNext);
PushNext++;
}
if(s.top()==*PopNext)
{
s.pop();
PopNext++;
}
else
break;
}
if(s.empty() && PopNext-pPop==length)
bPossible=true;
}
return bPossible;
}
int main()
{
if(IsPopOrder(arr1,arr2,5))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
if(IsPopOrder(arr1,arr3,5))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
system("pause");
return 0;
}
运行结果: