【剑指offer】堆栈推弹出序列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26077863


    剑指offer上的第22题,九度OJ上AC。

题目描写叙述:

输入两个整数序列。第一个序列表示栈的压入顺序,请推断第二个序列是否为该栈的弹出顺序。假设压入栈的全部数字均不相等。

比如序列1,2,3,4,5是某栈的压入顺序,序列4。5,3,2,1是该压栈序列相应的一个弹出序列。但4,3,5,1,2就不可能是该压栈序列的弹出序列。

输入:

每一个測试案例包括3行:

第一行为1个整数n(1<=n<=100000),表示序列的长度。

第二行包括n个整数。表示栈的压入顺序。

第三行包括n个整数,表示栈的弹出顺序。

输出:

相应每一个測试案例,假设第二个序列是第一个序列的弹出序列输出Yes。否则输出No。

例子输入:
5
1 2 3 4 5
4 5 3 2 1
5
1 2 3 4 5
4 3 5 1 2
例子输出:
Yes
No

    判定方法例如以下:

    假设第二个序列中当前要推断的元素刚好与栈顶元素相等,则直接pop出来,假设不等,则将第一个序列的后面还没有入栈的元素入栈,直到将与之相等的元素入栈为止,假设第一个序列的全部的元素都入栈了。还没有找到与之相等的元素,则说明第二个序列不是第一个序列的弹出序列,

    AC代码例如以下:

/*
本程序採用数组模拟栈
*/
typedef int ElemType;
#define MAX 100000 //栈的深度
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

int top = -1;
/*
在栈顶索引指针为top时。向栈A中压入数据data
*/
bool push(int *A,ElemType data)
{
	if(top>=MAX-1 || top<-1)
		return false;

	A[++top] = data;
	return true;
}

/*
在栈顶索引指针为top时,出栈
*/
bool pop()
{
	if(top<0)
		return false;

	top--;
	return true;
}

/*
推断popList是否是pushList的弹出序列
*/
bool IsPopOrder(int *pushList,int *popList,int len,int *stack)
{
	if(popList==NULL || pushList==NULL || len<1)
		return false;

	int i;
	int pushIndex = 0;
	for(i=0;i<len;i++)
	{
		while(top==-1 || stack[top] != popList[i])
		{
			//假设没有元素能够push了,就说明不符合
			if(pushIndex == len)
				return false;
			push(stack,pushList[pushIndex++]);
		}
		pop();
	}
	return true;
}

int main()
{
	int n;
	int stack[MAX]; //辅助栈
	while(scanf("%d",&n) != EOF)
	{
		int *pushList = (int *)malloc(n*sizeof(int));
		if(pushList == NULL)
			exit(EXIT_FAILURE);
		int i;
		for(i=0;i<n;i++)
			scanf("%d",pushList+i);

		int *popList = (int *)malloc(n*sizeof(int));
		if(popList == NULL)
			exit(EXIT_FAILURE);
		for(i=0;i<n;i++)
			scanf("%d",popList+i);

		if(IsPopOrder(pushList,popList,n,stack))
			printf("Yes\n");
		else
			printf("No\n");

		free(pushList);
		pushList = NULL;
		free(popList);
		popList = NULL;
	}
	return 0;
}

/**************************************************************
     Problem: 1366
     User: mmc_maodun
     Language: C
     Result: Accepted
     Time:210 ms
     Memory:2012 kb
****************************************************************/


版权声明:本文博主原创文章。博客,未经同意不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值