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

 

posted on 2013-08-16 16:22  紫金树下  阅读(230)  评论(0编辑  收藏  举报