关于栈混洗出栈次序问题

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值