29、栈的push、pop序列

题目:

输入两个整数序列。其中一个序列表示栈的push顺序,

判断另一个序列有没有可能是对应的pop顺序。
为了简单起见,我们假设push序列的任意两个整数都是不相等的。   

比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。

因为可以有如下的push和pop序列:

push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,

这样得到的pop序列就是4、5、3、2、1。

但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。


分析:

1、我们可以另外在建立一个栈,首先把push数组中第一个数组入栈,创建两个变量index_Push,index_Pop分别指向push的下一个元素和pop的第一个元素。

      然后是一个循环:

2、判断栈顶元素是不是等于index_Pop指向元素,如果等于,出栈,index_Pop后移;

3、如果不相等,移动index_Push直到所指向元素等于index_Pop指向元素。

      如果能找到,那么把之前的元素入栈(不包括移动后index_Push所指元素,就当它进栈后又出来了),然后同时把index_Push和index_Pop后移。

4、如果找不到,那么退出函数,报告:找不到! (一是因为找不到元素可以入栈,而是因为当前栈顶元素不等于所指index_Pop元素,出不了栈)。


给出代码:

#include <stdio.h>

#define N 5  //按照给定的测试用例

int top=-1,myStack[20],PushArr[20],PopArr[20];

int Judge();

int main()
{
	int i;
	FILE* infile=fopen("E://a.txt","r");
	if (!infile)
	{
		printf("The file cannot be opened!\n");
		return 1;
	}

	for (i=0;i<5;i++)
	{
		fscanf(infile,"%d",&PushArr[i]);
	}
	for (i=0;i<5;i++)
	{
		fscanf(infile,"%d",&PopArr[i]);
	}

	if (Judge())
	{
		printf("Yes!\n");
	}
	else
	{
		printf("No!\n");
	}

	return 0;
}

int Judge()
{
	int index_Push=0,index_Pop=0;

	myStack[++top]=PushArr[index_Push++];  //想将一个元素入栈
	while (index_Pop<N)   //在所有元素出栈之前循环
	{
		if (myStack[top]==PopArr[index_Pop])  //如果栈顶元素与当前要出栈的元素相等
		{
			top--;  //自定义栈出站一个元素
			index_Pop++;  //同时后移下一个要出栈目标
		}
		else
		{
			while (index_Push<N&&PushArr[index_Push]!=PopArr[index_Pop])  //如果不是,找寻下一个出栈目标
			{
				myStack[++top]=PushArr[index_Push];  //之前的元素入栈
				index_Push++;
			}
			if (index_Push==N)  //找不到,判定0
			{
				return 0;
			}
			else  //找到,两个下标同时后移
			{
				index_Push++;
				index_Pop++;
			}
		}
	}
	return 1;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值