题目:输入两个整数序列。其中一个序列表示栈的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)用两个指针分别指向数组的头部,pPush,pPop;
(2)根据pPop所指向的值,让pPush指针所指向的值进栈,直到栈顶元素和*pPop相等,同时记录pPush的进栈次数,只有少于序列长度才可以;
(3)比较栈顶元素和pPop,若相等则弹出,同时pPop后移,重复该过程直到不相等或者栈为空。
(4)如果序列长度已经入栈完毕且出栈也完毕,则可能,若进完没出完说明该序列不可能出现,若没进完则重复步骤(2)(3);
1 bool function(int *pPush,int * pPop,int length){ 2 int pushnum=0; 3 int popnum=0; 4 Stack s; 5 bool tag=false; 6 while(pushnum!=length){ 7 whlie(isEmptyStack(s)||GetStackHead(s)!=*pPop){ 8 Push(s,*pPush); 9 pPush++; 10 pushnum++; 11 if(pushnum==length) 12 break; 13 } 14 while(!isEmptyStack(s)&&GetStackHead(s)==*pPop){ 15 Pop(s); 16 popnum++; 17 pPop++; 18 } 19 if(pushnum==popnum&&pushnum=length) 20 tag=true; 21 } 22 return tag; 23 }