1.输入两个整数序列,第一个式进栈的顺序序列,第二个是出栈的顺序序列,判断出栈的序列是否合法。
分析:先根据出站的序列,来判断是非要进栈,如果当前的栈顶的元素和出站序列中的要比较的元素不相等,剩余的进栈序列继续进栈,直到栈顶的元素和出站的序列的元素相等。如果相等的话,则弹出栈顶的元素,继续比较下一个元素,按照相同的规则,直到所有的进栈序列都进栈,如果出现所有的待进栈的序列都进栈了,但是都没有找到栈顶的元素等于带比较的出站序列中的元素的话,则证明这个出站的序列不是正确的,不可能得到。下面是图示:
能得到的出站的序列
不可能得到的出站序列
源码:
#include<iostream>
#include<stack>
using namespace std;
bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
{
bool bPossible = false;
if (pPush != NULL && pPop != NULL && nLength > 0)
{
const int* pNextPush = pPush;
const int* pNextPop = pPop;
stack<int> stackData;
while (pNextPop - pPop < nLength)
{
// 当辅助栈的栈顶元素不是要弹出的元素
// 先压入一些数字入栈
while (stackData.empty() || stackData.top() != *pNextPop)
{
// 如果所有数字都压入辅助栈了,退出循环
if (pNextPush - pPush == nLength)
break;
stackData.push(*pNextPush);
pNextPush++;
}
if (stackData.top() != *pNextPop)
break;
stackData.pop();//此时栈顶的数据等于nPop序列的元素,可以比较下一个
pNextPop++;
}
if (stackData.empty() && pNextPop - pPop == nLength)//栈为空并且nPop序列中元素全部比较完成,才满足要求
bPossible = true;
}
return bPossible;
}
int main()
{
const int nLength = 5;
int push[nLength] = { 1, 2, 3, 4, 5 };
int pop[nLength] = { 4, 5, 3, 2, 1 };
int pop_2[nLength] = { 4, 3, 5, 1, 2 };
bool result = IsPopOrder(push, pop, nLength);
if (result == true)
cout << "correct" << endl;
else
cout << "error" << endl;
result = IsPopOrder(push, pop_2, nLength);
if (result == true)
cout << "correct" << endl;
else
cout << "error" << endl;
system("PAUSE");
return 0;
}
结果: