void permutation(StackByList<int>permutationArray)
{
//保存原栈数据,用于恢复被操作后的栈
StackByList<int>copyPermutationArray(permutationArray);
//用布尔链表构成一个深度搜索的体系,用true表示从原栈进入容器。false表示从容器进入目标栈
List<bool>isLeft;
//显然所需要的最深路径为二倍的栈长度。不妨让最开始的路为全进栈后再出栈
for (int i = 0;i < permutationArray.size()*2;i++)
isLeft.insertAsLast(true);
//用于记录在路径中的位置
ListNodePosi(bool) p = isLeft.first();
//声明容器
StackByList<int>container;
//声明目标栈
StackByList<int>objectArray;
while (true)
{
//如果路径中的当前位置是从原栈进入容器(true),并且原栈内有元素。
if (p->data&&permutationArray.size()!=0)
//就从原栈中pop出元素,并push到容器中
container.push(permutationArray.pop());
else//如果是从容器进入目标栈(false),或者原栈已空。
{
//如果容器已空,说明对容器的pop次数大于push次数。说明走入了错误的路径。
if (container.size() == 0)
{
//还原路径,并返回上一个分支点。
while (!p->data&&p != isLeft.first() )
{
//还原路径
p->data = true;
//返回上一个分支点。
p = p->pred;
}
//并走另一条路径。
p->data = false;
//如果是第一个位置,并且当前分支已经走过。
if (p == isLeft.first() && !p->data)
break;//跳出循环
//重置位置与各容器。
p = isLeft.first();
objectArray.clean();
container.clean();
permutationArray = copyPermutationArray;
continue;
}
//从容器进入目标栈(false)
objectArray.push(container.pop());
}
if (permutationArray.size() == 0)
{ //如果原栈空了,说明所有元素都在容器中或者目标栈中。次序已经确定。只需要从原栈转移到目标栈即可。
while (container.size() != 0)
objectArray.push(container.pop());
//转移完成,输出元素。
for (ListNodePosi(int)q = objectArray.first();q != objectArray.last()->succ;q = q->succ)
cout << q->data;
cout << " ";
//重置位置与各容器。
p->data = false;
p = isLeft.first();
objectArray.clean();
container.clean();
permutationArray = copyPermutationArray;
continue;
}
//移动到下一个位置。
p = p->succ;
}
}
{
//保存原栈数据,用于恢复被操作后的栈
StackByList<int>copyPermutationArray(permutationArray);
//用布尔链表构成一个深度搜索的体系,用true表示从原栈进入容器。false表示从容器进入目标栈
List<bool>isLeft;
//显然所需要的最深路径为二倍的栈长度。不妨让最开始的路为全进栈后再出栈
for (int i = 0;i < permutationArray.size()*2;i++)
isLeft.insertAsLast(true);
//用于记录在路径中的位置
ListNodePosi(bool) p = isLeft.first();
//声明容器
StackByList<int>container;
//声明目标栈
StackByList<int>objectArray;
while (true)
{
//如果路径中的当前位置是从原栈进入容器(true),并且原栈内有元素。
if (p->data&&permutationArray.size()!=0)
//就从原栈中pop出元素,并push到容器中
container.push(permutationArray.pop());
else//如果是从容器进入目标栈(false),或者原栈已空。
{
//如果容器已空,说明对容器的pop次数大于push次数。说明走入了错误的路径。
if (container.size() == 0)
{
//还原路径,并返回上一个分支点。
while (!p->data&&p != isLeft.first() )
{
//还原路径
p->data = true;
//返回上一个分支点。
p = p->pred;
}
//并走另一条路径。
p->data = false;
//如果是第一个位置,并且当前分支已经走过。
if (p == isLeft.first() && !p->data)
break;//跳出循环
//重置位置与各容器。
p = isLeft.first();
objectArray.clean();
container.clean();
permutationArray = copyPermutationArray;
continue;
}
//从容器进入目标栈(false)
objectArray.push(container.pop());
}
if (permutationArray.size() == 0)
{ //如果原栈空了,说明所有元素都在容器中或者目标栈中。次序已经确定。只需要从原栈转移到目标栈即可。
while (container.size() != 0)
objectArray.push(container.pop());
//转移完成,输出元素。
for (ListNodePosi(int)q = objectArray.first();q != objectArray.last()->succ;q = q->succ)
cout << q->data;
cout << " ";
//重置位置与各容器。
p->data = false;
p = isLeft.first();
objectArray.clean();
container.clean();
permutationArray = copyPermutationArray;
continue;
}
//移动到下一个位置。
p = p->succ;
}
}