【剑指offer】面试题22:栈的压入弹出序列


题目描述:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。


题目解析:

首先理解题意:压栈和出栈可以交替进行。为了便于分析,书中推荐举例子的方法,便于我们思考问题。我们设两个数列inbuf和outbuf。当现在要比较的outbuf[i]在栈顶的时候,我们就弹出该数据,接着比较outbuf[i+1];如果和栈顶元素不相等,则一边入栈一边比较。不过我用的方法是:当和栈顶元素不相等时,和要入栈的元素相比,如果相等了就不入栈了,直接比较下面的数据。我写的代码有重复的地方,还是应该先总结各种可能情况,再下手写代码比较好。这样结构更合理。


另一种方案:

在和出栈的元素比较前,先入栈,这样实现起来比较简单。如果所有元素都入栈了,那么出栈序列和栈顶元素比较,一旦发现不相等了,就返回错误。

bool Judge(int inbuf[],int outbuf[],int length)
{
    if(inbuf == NULL || outbuf == NULL || length <= 0)
        return false;

    int i,j=0;
    stack<int> S;
    for(i = 0;i < length;i++){
        S.push(inbuf[i]);   //先入栈,再和出栈序列判断
        if(outbuf[j] == S.top()){
            j++;
            S.pop();
        }
    }
    while(j < length){
        if(outbuf[j] != S.top())
            break;
        S.pop();
        j++;
    }
    if(j < length)
        return false;
    return true;
}




完整代码如下:

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

int g_Flag = FALSE;
typedef struct StackNode{
    int *base;
    int *top;
}StackNode;


int Judge(int inbuf[],int outbuf[],int iBegin,int oBegin,int n,StackNode *S);
void InitStack(StackNode *S,int n);
int Push(StackNode *S,int e);
int Pop(StackNode *S,int *e);
int GetTop(StackNode *S,int *e);
void DestoryStack(StackNode *S);


int main(void)
{
    int *inbuf;
    int *outbuf;
    int n;
    char ch;
    StackNode S;

    printf("input the how many numbers you want to input:");
    scanf("%d",&n);
    inbuf = (int *)malloc(n * sizeof(int));
    outbuf = (int *)malloc(n * sizeof(int));
    printf("input the inbuf:");
    for(int i = 0;i < n;++i)
        scanf("%d",&inbuf[i]);

    while(getchar() != '\n')
            ;
    printf("input a to continue:");
    while((ch = getchar()) == 'a'){
        printf("input the outbuf:");
        for(int i = 0;i < n;++i)
            scanf("%d",&outbuf[i]);

        InitStack(&S,n);
        int result = Judge(inbuf,outbuf,0,0,n,&S);
        if(result)
            printf("TRUE!\n");
        else
            printf("FALSE\n");
        DestoryStack(&S);
        while(getchar() != '\n')
            ;
        printf("input a to continue:");
    }


    return 0;
}

void InitStack(StackNode *S,int n)
{
    S->base = (int *)malloc(n * sizeof(int));
    if(!(S->base))
        exit(-1);
    S->top = S->base;
}

void DestoryStack(StackNode *S)
{
    free(S->base);
    S->top = S->base = NULL;
}

int Push(StackNode *S,int e)
{
    *(S->top) = e;
    ++S->top;
    return 1;
}

int Pop(StackNode *S,int *e)
{
    if(S->base == S->top)
        return 0;
    *e = *(--S->top);
    return 1;
}

int GetTop(StackNode *S,int *e)
{
    if(S->base == S->top)
        return 0;
    *e = *(S->top - 1);
    return 1;
}


int Judge(int inbuf[],int outbuf[],int iBegin,int oBegin,int n,StackNode *S)
{
    int e;

    if(oBegin >= n)
        return 1;

    if(iBegin < n){ //证明inbuf数组中还有数据
        if(GetTop(S,&e) && e == outbuf[oBegin]){    //如果栈中有数据,且和outbuf值相等,出栈!
            Pop(S,&e);
            oBegin++;
        }else if(inbuf[iBegin] == outbuf[oBegin]){  //如果数组中的数据相等了,索引都增加1
            ++iBegin;
            ++oBegin;
        }else{  //如果都不相等,则向堆栈放入数据
            Push(S,inbuf[iBegin]);
            ++iBegin;
        }
    }else{  //如果inbuf中没有数据了,一旦栈顶和要出栈的数据不相等就报错!
        if(GetTop(S,&e) && e == outbuf[oBegin]){
            Pop(S,&e);
            ++oBegin;
        }else
            return 0;
    }

    int flag = Judge(inbuf,outbuf,iBegin,oBegin,n,S);
    if(flag)
        return 1;
    else
        return 0;

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值