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序列(29)

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

栈的push、pop序列-判断序列是否是栈的pop顺序

程序员面试题精选100题(24)-栈的push、pop序列[数据结构]  题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设...
  • nanjunxiao
  • nanjunxiao
  • 2013年06月14日 21:01
  • 1435

栈的push,pop序列

题目:输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序。 思路:首先新建一个栈。从push序列开始遍历,如果当前元素与pop序列当前元素相等,则两个序...
  • moxiaomomo
  • moxiaomomo
  • 2011年05月24日 21:28
  • 1753

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

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

Java 判断栈的push和pop序列是否一致

判断栈的push和pop序列是否一致 import java.util.Stack;/** * 判断栈的push和pop序列是否一致 * * @author ZHOUMI2 * */ pu...
  • wuya814070935
  • wuya814070935
  • 2015年10月08日 14:53
  • 1057

输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。

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

栈的push pop序列

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

栈的push、pop序列

#include #include using namespace std; bool StackPop(int *p1,int *p2,int length); int main() { i...
  • lzaiwei
  • lzaiwei
  • 2014年09月05日 16:19
  • 216

栈的PUSH POP序列

输入两个整数序列, 其中一个表示栈的push顺序, 判断另一个序列有没有可能是对应的POP序列。 //下面使用一个栈来模拟这个操作过程, 栈顶元素等于出栈序列中的元素时出栈,不等于时入栈。 ...
  • haoyuedangkong_fei
  • haoyuedangkong_fei
  • 2016年08月03日 10:43
  • 111

栈的 push、 pop序列

输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。 如果我们希望pop的数字正好是栈顶数字,直接pop出栈即可;如果希望pop的数字目前不在栈顶,我们就...
  • qisefengzheng
  • qisefengzheng
  • 2016年05月16日 16:30
  • 230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:29、栈的push、pop序列
举报原因:
原因补充:

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