用棧洗牌
棧,先進後出。利用此特性將數據分段、打亂
一張圖理解下面的代碼:
上代碼:
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));
}