栈的push、pop序列

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

 

原文地址:https://www.cnblogs.com/GoAhead/p/2521155.html