compacta.cpp
//__INSERT_LICENSE__
// $Id$
#include <cstdio>
#include <cstdlib>
#include <list>
#include <stack>
#include "./util.h"
using namespace std;
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
Escribir una funci\'on #void compacta(list<int> &L,stack<int> &S);# que
toma un elemento entero #n# de #S# y, si es positivo,
saca #n# elementos de #L# y los reemplaza por su suma. Esto ocurre
con todos los elementos de #S# hasta que se acaben, o bien se acaben
los elementos de #L#.
[Tomado en el primer parcial del cursado 2010, 2010-09-14.]
keywords: lista, correspondencia
FIN DE DESCRIPCION */
// -------------------------------------------------------------------
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void compacta(list<int> &L,stack<int> &S) {
// `p' va recorriendo la lista
list<int>::iterator p = L.begin();
while (!S.empty() && p!=L.end()) {
// Toma un elemento de `S'
int n = S.top();
S.pop();
// Si es >0 hace la manip
if (n>0) {
// Acumula en `sum'
// `k' es el contador de los elementos
int sum = 0, k=0;
// OJO corta pq se llegan a los `n' elementos
// o pq se acaba la lista
while (k<n && p!=L.end()) {
sum += *p;
p = L.erase(p);
k++;
}
// Inserta la suma en `L'
p = L.insert(p,sum);
p++;
}
}
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
for (int j=0; j<10; j++) {
printf("\n\n--------------\n");
list<int> L;
stack<int> S;
for (int j=0; j<10; j++)
L.push_back(rand()%5);
for (int j=0; j<5; j++)
S.push(rand()%5-1);
printl(L);
print_stack(S);
compacta(L,S);
printl(L);
print_stack(S);
}
return 0;
}
Generated by GNU Enscript 1.6.6.