通過洗牌實例看棧(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));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章