chunk-revert.cpp
//__INSERT_LICENSE__
// $Id$
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Escribir una funci\'on
#void chunk_revert(list<int> &L,int n);# que
dada una lista #L# y un entero #n#,
invierte los elementos de la lista tomados de a #n#.
Si la longitud de la lista no es m\'ultiplo de #n#
entonces se invierte el resto tambi\'en.
Por ejemplo, si #L={1,3,2,5,4,6,2,7}#
entonces despu\'es de hacer #chunk_revert(L,3)# debe
quedar #L={2,3,1,6,4,5,7,2}#.
_Restricciones:_ Usar a lo sumo una estructura auxiliar.
(En tal caso debe ser lista, pila o cola).
[Tomado en el 1er parcial 21/4/2005].
keywords: lista
FIN DE DESCRIPCION */
// -----------------------------------------------------------------
#include <list>
#include <queue>
#include <stack>
#include "./util.h"
using namespace std;
// -------------------------------------------------------------------
// Version con pila
void chunk_revert (list<int> &L, int n) {
stack<int> S;
list<int>::iterator q;
q = L.begin();
while (q!=L.end()) {
for (int j=0; j<n; j++) {
if (q == L.end()) break;
S.push(*q);
q = L.erase(q);
} // end for
while (!S.empty()) {
q = L.insert(q,S.top());
q++;
S.pop();
} // end while
} // end while
}
// -------------------------------------------------------------------
// Version con cola
void chunk_revert4 (list<int> &L, int n) {
queue<int> Q;
list<int>::iterator q;
int m ;
q = L.begin();
while (q!=L.end()) {
for (int j=0; j<n; j++) {
if (q == L.end()) break;
Q.push(*q);
q = L.erase(q);
} // end for
m = Q.size();
while (!Q.empty()) {
q = L.insert(q,Q.front());
Q.pop();
} // end while
for (int j=0; j<m; j++) q++;
} // end while
}
// -------------------------------------------------------------------
// Version `in place'
void chunk_revert2 (list<int> &L, int n) {
list<int>::iterator q, p;
q = L.begin();
int m, x;
while (q!=L.end()) {
p = q;
for (m=0; m<n; m++)
if (p++ == L.end()) break;
for (int j=0; j<m; j++) {
x = *q;
q = L.erase(q);
p = q;
for (int k=0; k<m-j-1; k++) p++;
p = L.insert(p,x);
} // end for
q = p;
for (int j=0; j<m; j++) q++;
} // end while
}
// -------------------------------------------------------------------
// Version `in place' 2 (sin suprimir ni insertar)
void chunk_revert3(list<int> &L,int n) {
list<int>::iterator q, p, r;
int m, x;
q = L.begin();
while (q!=L.end()) {
p = q;
for (m=0; m<n; m++)
if (p++==L.end()) break;
r = q;
for (int j=0; j<m/2; j++) {
x = *q;
p = q;
for (int k=0; k<m-2*j-1; k++) p++;
*q = *p;
*p = x;
} // end for
q = r;
for (int j=0; j<m; j++) q++;
} // end while
}
// -------------------------------------------------------------------
int main() {
list<int> L,L1;
for (int j=0; j<20; j++) L.push_back(j);
L1 = L;
printl(L);
chunk_revert4(L,3);
printl(L);
}
// -------------------------------------------------------------------
Generated by GNU Enscript 1.6.6.