思路:假设入栈序列{1,2,3,4,5},出栈序列{4,5,3,2,1};首先我们将入栈序列的第一个元素入栈,这是设置一个指针只想出栈序列的第一个元素,如果出入栈以后,栈顶
元素和出栈指针所指向的元素相等,那么就让栈顶元素出栈,让指针++,最后判断栈为空就好,若为空,就说明是合法的,如果不是就是不合法。
代码如下:
#include<iostream>
#include<assert.h>
#include<stack>
using namespace std;
bool IsLegal(int* stackin,int* stackout,int lenin,int lenout)
{
assert(stackin&&stackout);//判断入栈、出栈序列不为空
if(lenin!=lenout)//入栈长度不等于出栈长度,不合法
{
return false;
}
stack<int> l1;
int i=0;
int j=0;
for(;i<lenin;++i)
{
l1.push(stackin[i]);//将元素一一入栈
while(l1.size()>0&&l1.top()==stackout[j])//保证栈里的元素不为空,并且每次栈顶均要和出栈序列一一匹配
{
l1.pop();
++j;
}
}
if(l1.size()==0)
return true;
else
return false;
}
void TestStack()
{
int stackin[]={1,2,3,4,5};
//int stackout[]={4,5,3,2,1};
int stackout[]={1,5,3,2,4};
int lenin=sizeof(stackin);
int lenout=sizeof(stackout);
int A=IsLegal(stackin,stackout,lenin,lenout);
if(A)
{
cout<<"出栈顺序合法"<<endl;
}
else
{
cout<<"出战顺序不合法"<<endl;
}
}
int main()
{
TestStack();
return 0;
}