关闭

29、栈的push、pop序列

401人阅读 评论(0) 收藏 举报

题目:

输入两个整数序列。其中一个序列表示栈的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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:217819次
    • 积分:3268
    • 等级:
    • 排名:第10438名
    • 原创:114篇
    • 转载:37篇
    • 译文:0篇
    • 评论:23条
    最新评论