cum_sum_pila.cpp

// $Id$

/* COMIENZO DE DESCRIPCION 

  __USE_WIKI__
  Escribir una funci\'on 
  #void cum_sum_pila (queue<int> &S)# que modifica a la 
  pila #S# dejando la suma acumulada de sus elementos, es 
  decir, si los elementos de #S# antes de llamar a 
  #cum_sum_pila(S)# son #S = (a_0,a_1,...,a_{n-1})#, 
  entonces despu\'es de llamar a #cum_sum_pila(S)# debe 
  quedar #S = (a_0, a_0 + a_1, ..., a_0 + a_1 + ... + a_n)#. 
  [Tomado en el Primer Parcial 27-ABR-2004]
   keywords: pila

   FIN DE DESCRIPCION */

/* 
  Escribir una funci\'on 
  {\tt void cum\_sum\_pila (stack<int> &S)} que modifica a la 
  pila {\tt S} dejando la suma acumulada de sus elementos, es 
  decir, si los elementos de {\tt S} antes de llamar a 
  {\tt cum\_sum\_pila (S)} son $ S = (a_0,a_1,\ldots,a_{n-1})$, 
  entonces despu\'es de llamar a {\tt cum\_sum\_pila (S)} debe 
  quedar $ S = (a_0,a_0+a_1,\ldots,a_0+a_1+\ldots+a_n)$. 
  Por ejemplo, si {\tt S = (1,3,2,4,2)} entonces despu\'es de hacer
  {\tt cum\_sum\_pila (S)} debe quedar {\tt S = (1,4,6,10,12)}. 
  Restricciones: (i) usar una pila auxiliar; (ii) usar la interfase 
  STL para pilas ({\tt clear (), top (), pop (), push (T x)+, 
  size (), empty ()}); (iii) NO usar m\'as estructuras auxiliares 
  que la indicada ni otros algoritmos de STL; y (iv) el algoritmo 
  debe ser $O(n)$. 
  [Tomado en el Primer Parcial 27-ABR-2004]
   keywords: pila
   FIN DE DESCRIPCION */
// -----------------------------------------------------------------
#include <iostream>
#include <stack>
#include <list>
#include "./util.h"
using namespace std ;

//--------------------------------------------------------------------
void cum_sum_pila (stack<int> & S) {
  stack<int> C ;
  int x=0; 
  while ( !S.empty() ) {
    x += S.top (); S.pop ();
    C.push (x) ;
  } //
  while ( !C.empty() ) {
    x = C.top (); C.pop ();
    S.push (x) ;
  } //
}

//--------------------------------------------------------------------
void imprime_pila (stack<int> & S) {
  stack<int> C ;
  int x ; 
  cout << endl ;
  cout << "pila  S: " ;
  while ( !S.empty() ) {
    x = S.top (); 
    C.push (x) ;
    cout << x << " " ;
    S.pop (); // la unica forma de avanzar en la pila S
  } //
  cout << endl ;
  while ( !C.empty() ) {
    x = C.top (); 
    S.push (x) ;
    C.pop (); // la unica forma de avanzar en la pila S
  } //
}

//--------------------------------------------------------------------
int main() {
  int a [] = {1,3,5,4,2,3,7,3,5,-1};
  list<int> L ;
  list<int>::iterator p;
  stack<int> S;

  insertl (L, a, -1) ; 
  //cout << endl << endl << "lista L: "; printl (L);
  p = L.begin();
  while (p != L.end() ) S.push (*p++) ;

  imprime_pila (S);
  cum_sum_pila (S);
  imprime_pila (S);

  cout << endl;
  return 0;
}
// -----------------------------------------------------------------


Generated by GNU Enscript 1.6.6.