剑指offer面试题22栈的压入弹出序列
来源:互联网 发布:四川网络大学考试平台 编辑:程序博客网 时间:2024/06/08 04:17
/*记得有一种规律 如果如栈序列是有序的 比如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;}