用栈洗牌
栈,先进后出。利用此特性将数据分段、打乱
一张图理解下面的代码:
上代码:
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));
}