zoukankan      html  css  js  c++  java
  • 29. 栈的push,pop序列

    题目:给定2个整数序列,其中1个是栈的push顺序,判断另一个有没有可能是对应的pop顺序

    解:其实这题主要是判断进栈次数和出栈次数誓不是相等。我是用栈作的,效率不高,每一个元素最多出栈1次,进栈1此,所以最多进行2n次操作,然后每次对栈顶元素和pb指针指向的元素进行比较(因为假设序列中整数都不相等)

    代码:

    /*
         判断栈push和pop顺序是否符合
         push中的元素顺序入栈,如果等于pb指向的元素,那么循环出栈,知道栈空或者pb元素和栈顶元素不一样,如果一样,出栈且pb++,总共的入栈出栈次数最多是2*n次
     */
    
    #include<iostream>
    using namespace std;
    #define MAX 50
    
    typedef struct 
    {
        int data[MAX];
        int top;
    }Stack;
    
    Stack* create_stack(void)
    {
        Stack* s=new Stack;
        if(s)
            s->top=-1;
    
        return s;
    }
    
    bool empty_stack(Stack* s)
    {
        if(-1==s->top)
            return true;
        return false;
    }
    
    bool full_stack(Stack* s)
    {
        if(MAX-1==s->top)
            return true;
        return false;
    }
    
    void push_stack(Stack* s,int value)
    {
        if(full_stack(s))
            return ;
        s->top++;
        s->data[s->top]=value;
    }
    
    int pop_stack(Stack* s)
    {
        if(empty_stack(s))
            return -1;
        int temp=s->data[s->top];
        s->top--;
        return temp;
    }
    
    int get_stack(Stack* s)
    {
        if(empty_stack(s))
            return -1;
        return s->data[s->top];
    }
    
    void free_stack(Stack* s)
    {
        if(s)
        {
            delete s;
            s=NULL;
        }
    }
    
    bool  satisfy(int *a,int *b,int n)
    {
        int i=0;
        int pa,pb;
        Stack* s;
    
    
        pa=0;
        pb=0;
        s=create_stack();
        while(i++<2*n)
        {
            if(pa==n && pb==n)
                break;
            if(pa<n)
            {    
                push_stack(s,a[pa]);
                pa++;
            }
    
            while(!empty_stack(s) && get_stack(s)==b[pb])
            {
                pop_stack(s);
                pb++;
            }
        }
    
        bool flag;
        if(empty_stack(s) && pb==n)
            flag=true;
        else
            flag=false;
        free_stack(s);
    
        return flag;
    
    }
    
    int main(void)
    {
        int a[MAX];
        int b[MAX];
        int n,i;
    
        cin>>n;
    
        for(i=0;i<n;i++)
            cin>>a[i];
        for(i=0;i<n;i++)
            cin>>b[i];
        
        cout<<boolalpha;
        cout<<satisfy(a,b,n)<<endl;
    
        return 0;
    }
  • 相关阅读:
    php中"::"双冒号有什么作用
    微信公众平台中的openid是什么?
    微信支付:“当前页面的URL未注册”
    HTTPS的一些疑问解答
    傻瓜式十分钟免费开启 HTTPS,是时候为你的站点加上小绿锁了
    微信支付开发(1) JS API支付V3版(转)
    php支付宝接口用法
    DedeCMS Error: (PHP 5.3 and above) Please set request_order
    使用 Laravel 框架:成为微信公众平台开发者
    thread线程栈size及局部变量最大可分配size【转】
  • 原文地址:https://www.cnblogs.com/buxianghe/p/3262418.html
Copyright © 2011-2022 走看看