结构推理 试证明:有可能从初始输入序列1,2,…,n,利用一个栈得到输出序列p1,p2,…,pn(p1,p2,…,pn是1,2,…,n的一种排列)的充分必要条件是,不存在这样的下标i,j,k,满足i<j<k同时pj<pk<pi
【正确答案】(1)必要性:用反证法证明。
   假如存在i,j,k,使i<j<k与pj<pk<pi同时成立,则有:
   ①由于i<j<k,三元素出栈的相对次序应为pi,pj,pk
   ②因为pj<pk<pi,所以入栈的相对次序为pj,pk,pi
   根据②,当Pi入栈时,如果pj和pk都在栈中,pj必在pk之下。所以出栈的相对次序只能为pi,pk,pj。故与①矛盾。
   (2)充分性
   设序列p1,p2,…,pn符合条件,则我们可以用下述方法逐个地使pi(j=1,2,…,n)加入该序列。
   情况1:若pj在输入序列的剩余部分(假设1,2,…,i-1已经输入)i,i+1,…,n中,则把pj之前的元素及pj进栈,然后把pj从栈中取出送入序列。
   情况2:若pj已经在栈中,则它必然在栈顶(这是因为栈中元素在任何时刻显然都是从顶向下递减的,而刚离栈的pj-1大于栈中的所有元素。假如pj不在栈顶,设栈顶元素是pk,我们有j-1<j<k,而pj-1>pk>pi。与已知条件矛盾。)把栈顶元素取出送入序列。
   重复上述步骤,可得到所要求的序列。充分性得证。
【答案解析】