22--给栈的压入和弹出序列,判断弹出序列是否为压入序列出栈的一种

一、问题描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的其中一种弹出顺序。假设压入站的所有数字均不相等。
【例如】
序列1、2、3、4、5是某栈的压入序列,
则序列4、5、3、2、1是该压栈序列对应的其中一个弹出序列

序列  4、3、5、1、2不是该压栈序列对应的其中一个弹出序列

二、题目分析

判断一个序列是不是栈的弹出序列的规律:
1)如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;
2)如果下一个弹出的数字不在栈顶,把压栈序列中还没有入栈的数字入栈,直到把下一个需要弹出
的数字压入栈顶为止;

3)如果所有数字都入栈了还没有找到下一个弹出的数字,那么该序列不可抗是该栈的一个弹出序列

三、算法试下

1、栈结构定义

/************************************************
author:tmw
date:2018-7-1
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/**栈数据结构引入**/
#define MAXSIZE 10000
#define OVERFLOW 0
#define error -65530

/**栈的数据结构定义**/
typedef struct Sq_stack
{
    int data[MAXSIZE];
    int top;
}Sq_stack;

/**栈的创建--初始化**/
void initStack(Sq_stack *S)
{
    S = (Sq_stack*)malloc(sizeof(Sq_stack));
    if(!S)
        exit(OVERFLOW);//栈空间分配失败
    S->top = 0; //栈顶元素从0开始算起
}

/**插入栈顶元素e**/
bool Push(Sq_stack *S, int e)
{
    /**插入栈顶元素:判断栈是否已满**/
    if( S->top == MAXSIZE-1 )
        return false;
    S->top++;
    S->data[S->top] = e;
    return true;
}

/**删除栈顶元素,并用节点承接**/
int* Pop(Sq_stack *S)
{
    /**删除栈顶元素:判断栈是否为空**/
    if(S->top == 0)
        return NULL;
    int* e = (int*)malloc(sizeof(int));
    *e = S->data[S->top];
    S->top--;
    return e;
}

bool isEmptyStack( Sq_stack *S )
{
    return S->top == 0?true:false;
}

2、主算法

/**
* 判断弹出序列是否为入栈序列的一种弹出序列
* @param *in_order 入栈序列
* @param *out_order 弹出序列
* @param len        入栈序列和弹出序列的长度必须是一致的
*/
bool isPopOrder( int* in_order, int* out_order, int len )
{
    /**入参检查**/
    if( !in_order || !out_order || len<=0 ) return false;

    bool is_right_order = false;

    /**定义输入序列和输出序列的游标**/
    int index_inorder = 0;
    int index_outorder = 0;

    /**定义栈,并初始化**/
    Sq_stack* data_stack = NULL;
    initStack(data_stack);

    while( index_outorder < len )
    {
        /**in_order序列入栈操作:栈为空,或者当前栈顶元素 != 当前弹出序列元素**/
        while( isEmptyStack(data_stack)
              || data_stack->data[data_stack->top] != out_order[index_outorder] )
        {
            /**将inorder序列入栈前提:inorder序列还有剩余元素**/
            if( index_inorder == len-1 ) /**无剩余元素了,不能入栈**/
                break;

            /**有剩余元素:入栈**/
            Push(data_stack,in_order[index_inorder]);

            index_inorder++; /**in_order序列游标右移**/
        }

        /**如果下一个弹出的数字刚好是栈顶数字,那么直接弹出,否则break**/
        int *e = (int*)malloc(sizeof(int));
        e = Pop(data_stack);
        if( *e != out_order[index_inorder] )
        {
            /**由于程序限制,执行Pop(data_stack)时就已经把元素Pop出来了,需要回补..**/
            Push(data_stack,*e);
            break;
        }
        Pop(data_stack);
        free(e);

        /**当前out_order序列的元素判断完了,记得游标右移**/
        index_outorder++;
    }

    if( !isEmptyStack(data_stack) && index_inorder==len )
        is_right_order = true;

    return is_right_order;
}



梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~

猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/80874864