假设入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1),判断出栈序列是否合法?
实现思路:
总的来说就是模拟元素的出入栈过程,并进行判断。
首先,判断出栈序列和入栈序列的元素个数是否相等,若不相等,则不合法;若相等,则继续进行判断。
其次,遍历入栈序列并依次对元素进行入栈,在入栈每个元素时,都判断是否与出栈序列的index位置元素相等,若相等,出栈该元素,index++;若不相等,则不合法;并且index要小于出栈元素个数,否则不合法。
代码实现:
//元素出栈入栈顺序的合法性 int StackOrder(StackType input[], StackType output[], int insize, int outsize) { assert(input); assert(output); if(insize != outsize) return 0; int i = 0; SeqStack s; InitSeqStack(&s); int out_index = 0; StackType top; for(; i < insize; i++) { PushSeqStack(&s, input[i]); while(TopSeqStack(&s, &top)) { if(out_index >= outsize) break; if(top == output[out_index]) { PopSeqStack(&s); ++out_index; } else { break; } } } if(out_index == outsize && TopSeqStack(&s, &top) == 0) return 1; return 0; }