一、问题描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的其中一种弹出顺序。假设压入站的所有数字均不相等。
【例如】
序列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;
}
梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~