给定一个入栈的序列,比如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 }
代码还未经运行验证,晚上回去再验证。