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