剑指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;}

原创粉丝点击