题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
特点:化抽象为具体
过程分析:根据栈的特点:先入后出。首先建立一个辅助栈StackData,根据压入序列PushV,每将一个整数压入辅助栈StackData时,与弹出序列PopV做比较,如果不等,继续压入;如果相等,则弹出此时的栈顶元素StackData.pop()。
终止条件:辅助栈为空且同时PushV全部压入过栈(设置计数变量)。
鲁棒性:输入序列非空,两个序列长度相等。
1,输入参数:两个Vector模板类,参考代码如下:
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
class Solution {
public:
bool IsPopOrder(vector<int> pushV, vector<int> popV)
{
bool bPossilble = false;
if (pushV.empty() || popV.empty() || pushV.size() != popV.size())
return bPossilble;
stack<int>StackData;
int pPush = 0;
for (int i = 0; i < popV.size(); i++)
{
for (int j = pPush; j < pushV.size(); j++)
{
if (StackData.empty() || StackData.top() != popV[i])
{
StackData.push(pushV[j]);
pPush++;
}
else
break;
}
if (StackData.top() != popV[i])
break;
StackData.pop();
}
if (StackData.empty() && pPush == pushV.size())
bPossilble = true;
return bPossilble;
}
};
根据模板类vector的特点,此处可以通过直接引用其public函数来获得序列的个数,故采用for循环。
2,输入参数:两个数组指针,参考代码如下:
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
class Solution {
public:
bool IsPopOrder(const int *pPush,const int *pPop,int nLength)
{
bool bPossible = false;
if (pPush!=nullptr&&pPop!=nullptr&&nLength>0)
{
const int *pNextPop = pPop;
const int *pNextPush = pPush;
stack<int>StackData;
while (pNextPop-pPop<nLength)
{
while (StackData.empty()||StackData.top()!=*pNextPop)
{
if (pNextPush - pPush == nLength)
break;
StackData.push(*pNextPush);
pNextPop++;
}
if (StackData.top() != *pNextPop)
break;
StackData.pop();
pNextPop++;
}
if (StackData.empty() && pNextPop - pPop == nLength)
bPossible = true;
}
return bPossible;
}
};
当输入参数为数组指针时,使用while循环更方便。