思路:假設入棧序列{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;
}