给定一个入栈的序列,比如1,2,3,4,5;然后给定一个序列,比如4,5,3,2,1,判断该序列是否可能是出栈的序列(假定元素没有相同值)。

算法思路大描述:

假定PopSeries,PushSeries分别为出栈序列和入栈序列
(1)找到PopSeries的第一个未处理元素赋值给cur_element,如果该元素已经入栈,(3);如果没有,(2);

(2)在PushSeries中找到cur_element,将cur_element及其之前未入栈的元素全部入栈;

(3)弹出栈顶元素,并且和cur_element比较,若相等,则继续,若不相等,则不是合理的出栈顺序;

 

循环上述步骤,知道全部处理。

#define ARRAY_EMPTY -1
#define REASONABLE_SERIES 0
#define UNREASONABLE_SERIES 1



int isPopSeries (int * pushseries, int * popseries, int num_element)
{ 
 //判断给的数组指针是否为空 
  if(NULL==pushseries || NULL==popseries)
    return ARRAY_EMPTY;
    
  int ipush,ipop;
  ipush=-1;
  ipop=0;
  stack<int> stack_tmp;

  while(ipop < num_element)
 {
  int cur_element=popseries[ipop];
  
   int j=0;
  //在pushseries数组中查找当前处理元素cur_element
  while(pushseries[j]!=cur_element)
  {
    j++;
  }

  //j<ipush说明cur_element已经在先前操作中入栈,接下来就弹出栈     
  //顶元素,看是否和当前处理元素cur_element相等,如果不等,就  
  //不是合理的出栈次序
  if(j<ipush)
  {
     if(stack_tmp.top()!=cur_element)
        return UNREASONABLE_SERIES;
     else
        stack_tmp.pop();
  }

  //如果j>ipush,说明cur_element还没有入栈,则将其及其前面未入
  //栈的元素入栈
  else
  {
     for (ipush=ipush+1;ipush<=j;ipush++)
        {
           stack_tmp.push(pushseries[ipush])
        }
     
     if(stack_tmp.top()!=cur_element)
      {
          return UNREASONABLE_SERIES
      }
     else stack_tmp.pop();
  }

  return REASONABLE_SERIES
                 
}    

代码还未经运行验证,晚上回去再验证。