通过洗牌实例看栈(C)

用栈洗牌

栈,先进后出。利用此特性将数据分段、打乱

一张理解下面的代码:在这里插入图片描述


代码

1

WashData

/*
    func:将栈<source>中的元素打乱置入栈<aim>中
    #source:数据来源栈
    #aim:数据打乱后放置的栈
    #buffersize:中转栈的元素最大值<每有buffersize个元素就转移到aim中>
*/
template <typename T>
void WashData(stack<T>& source,stack<T>& aim,size_t buffersize)
{
    stack<T> Buffer;
    while(!source.empty()){ //loop:直到栈source空
        T elem = Pop(source);
        /* 如果不满足条件,将弹出元素压入buffer栈中 ----------------B */
        /* 否则直接压入aim栈,然后将buffer中元素转移到aim栈中 ------A */
        if( source.empty() || Buffer.size()>=buffersize ){
           aim.push(elem); //-----------------------------------A
           TransToAim(Buffer,aim);//转移buffer中元素到aim中
        }else 
           Buffer.push(elem); //--------------------------------B          
    }
}

2

其中Pop()是使用C++中stack类的pop方法封装的模板函数:
(stack的pop方法返回值类型为void)

/* 弹出栈顶元素并返回其值 */
template <typename T>
T Pop(stack<T>& stc)
{
    T var = stc.top();
    stc.pop();
    return var;
}

3

TransToAim

/*
    将栈source中的元素转移到栈aim中
*/
template <typename T>
void TransToAim(stack<T>& source,stack<T>& aim)
{
    while(!source.empty())
        aim.push(Pop(source));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章