29、栈的push、pop序列

原创 2012年03月22日 21:05:04

题目:

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



相关文章推荐

数据结构之栈的push与pop操作(顺序存储结构的c实现)

枝( stack )是限定仅在襄尾进行捕入和删除撮伟的雄性袋。

浅谈C++中的运行栈的一些知识

今天又看了一遍有关运行栈的知识,在此,我谈谈我的想法。 栈,顾名思义,就是客栈的意思(通俗来说)。就说明了它是临时歇息的地方,不是长久停留的地方。 变量分全局变量和局部变量,全局变量自始至终有确定...

算法习题29:栈的push、pop序列是否一致

栈的push、pop序列 题目:输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的。...
  • ylf13
  • ylf13
  • 2013年10月22日 15:29
  • 591

程序员面试题精选100题(24)-栈的push、pop序列[数据结构]

题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、...

栈的push、pop序列

题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。  比如输入的push序列是1...

栈的push pop序列

题目:输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1...

栈的push,pop序列

题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、...

程序员面试题精选100题(24)-栈的push、pop序列

http://zhedahht.blog.163.com/blog/static/25411174200732102055385/ 题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一...
  • ZCSYLJ
  • ZCSYLJ
  • 2011年09月28日 21:18
  • 315

【100题】第二十九 栈的push、pop序列

一,题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。                   如果我们希望pop的数字正好是栈顶数字,直接pop出栈...

栈的push、pop序列 【微软面试100题 第二十九题】

题目要求:   输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:29、栈的push、pop序列
举报原因:
原因补充:

(最多只允许输入30个字)