/*
记得有一种规律 如果如栈序列是有序的 比如1 2 3 4 5有一种规律的 忘记了
但是这里不一定是有序的 就模拟了。
规则是
如果下一个要弹出的数字刚好是栈顶数字 那么直接pop
如果不是的话 从如栈序列还有入栈的数字 压入栈 知道遇到这个数字
*/
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
bool IsPopOrder(const int * push,const int * pop,int len)
{
bool ok=false;
if(push==NULL || pop==NULL || len<=0) return false;
const int * p1=push;//两个指针要移动 但是不能改变数组元素
const int * p2=pop;
stack<int > sstack;
while(p2-pop<len)//p2是需要的弹出序列 p2-pop就是 弹出的元素的下标
{
while(sstack.empty() || sstack.top()!=*p2)//如果空 或者栈顶不等于*p2 就一直压入
{
if(p1-push==len)// 全部都入栈了 还是不相等 那直接break
break;
sstack.push(*p1);//一直入栈
p1++;
}
if(sstack.top()!=*p2)
break;
sstack.pop();//相当了 出栈
p2++;//p2 移动
}
if(sstack.empty() && p2-pop==len)//最后栈空 并且p2移动到了 最后一个元素的后一个
ok=true;
return ok;
}
int main()
{
int data1[5]={1,2,3,4,5};
int data2[5]={4,5,3,2,1};
int data3[5]={4,3,5,1,2};
cout<<IsPopOrder(data1,data2,5)<<endl;
cout<<IsPopOrder(data1,data3,5)<<endl;
return 0;
}