• 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;
    }
  • 相关阅读:
    QuantLib 金融计算——案例之固息债的关键利率久期(KRD)
    Elasticsearch 最佳运维实践
    Ansible常用的Ansible Module
    中国七夕节( Chinese Valentine's Day)IT的浪漫情结
    Leetcode之C++刷题生死战
    无需Root可自动定时发送微信和短信的黑科技APP,支持跳过开屏启动广告
    tmp
    【整理中】可靠性基础_抽样检测
    【汇总】命名及标识
    Treelist父节点上下移
  • 原文地址:https://www.cnblogs.com/buxianghe/p/3262418.html
Copyright © 2020-2023  润新知