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;
    }
  • 相关阅读:
    eclipse如何正确部署tomcat7
    调用awk的三种方式
    jupyter的简单操作
    编程语言简介
    2019.9.6作业
    计算机的基本组成
    9.2作业
    CPP 栈 示例
    关于使用栈将一般运算式翻译为后缀表达式并实现三级运算的方法及实例(cpp版)
    深度遍历破解数独游戏
  • 原文地址:https://www.cnblogs.com/buxianghe/p/3262418.html
Copyright © 2011-2022 走看看