lexico_stack.cpp

// $Id$

/* COMIENZO DE DESCRIPCION 

   __USE_WIKI__
   Escribir una funci\'on #void lexico_stack(int n);#
   que genera todas las subsecuencias ordenadas de 
   la secuencia (1..n). Por ejemplo, si #n=4# debe 
   generar (1), (12), (123), (124), (13), 
   (134), (14) (2), (23), (234) (24), (3), (34) y (4). 
   [Tomado en el 1er parcial del 21/4/2005].
   keywords: pila
   FIN DE DESCRIPCION */

/* Considere el problema de generar todas las subsecuencias
   ordenadas de la secuencia $ X = (1, 2, ..., n) $. 
   %
   Por ejemplo, si $n=4$ las subsecuencias ordenadas de
   $ X = (1,2,3,4) $ son: (1), (12), (123), (124), (13), 
   (134), (14) (2), (23), (234) (24), (3), (34) y (4).
   %
   Esta construcci\'on se puede implementar mediante el uso de 
   una pila $ S $ bajo las siguientes reglas: 
   %
   \begin{itemize}
     \compactlist 
    \item Inicializar la pila con el elemento 1.
    \item Si el tope $ t $ de la pila verifica $ t < n $ 
          entonces apilamos $ t + 1 $.
    \item Si $ t = n $, entonces lo desapilamos 
          y, a continuaci\'on, si la pila no quedara 
          vac\'\i{}a incrementamos el nuevo tope de la misma. 
    \item El algoritmo termina cuando la pila queda vac\'{\i}a. 
   \end{itemize}
   %
   Ejemplo:
   S = (1) ;
   S = (2,1) ;
   S = (3,2,1) ;
   S = (4,3,2,1) ;
   S = (4,2,1) ;
   S = (3,1) ;
   S = (4,3,1) ;
   S = (4,1) ;
   S = (2) ;
   S = (3,2) ;
   S = (4,3,2) ;
   S = (4,2) ;
   S = (3) ;
   S = (4,3) ;
   S = (4) ;
   S = ( ) ;
   %
   % \begin{Verbatim}
   %       4
   %     3 3 4   4       4
   %   2 2 2 2 3 3 4   3 3 4   4
   % 1 1 1 1 1 1 1 1 2 2 2 2 3 3 4 --
   % \end{Verbatim}
   %
   \emph{Consigna:} Escriba un procedimiento 
     {\tt void lexico\_stack(int \&n);}
   en el cual, ingresado el n\'umero natural $ n $ 
   imprime todos los conjuntos ordenados de 
   $(1,2,...,n)$. 
   \emph{Sugerencia:} Implementar el algoritmo descripto llamando 
   a una funci\'on auxiliar {\tt void imprime\_pila(stack<int> \&S)} 
   (implementarla !!) que imprime la pila {\tt S} en forma 
   no-destructiva. 
   \textbf{Restricciones:}
   \begin{itemize} \compactlist 
   \item Usar la interfase STL para pilas.
   \item En {\tt lexico_stack} usar una sola estructura auxiliar. 
   \item En {\tt imprime\_pila()} usar una sola estructura auxiliar. 
   \item No usar otros algoritmos de STL.
   \end{itemize}
   [Tomado en el 1er parcial del 21/4/2005].
   keywords: pila. */

// -----------------------------------------------------------------
#include <iostream>
#include <stack>
#include <list>
#include "./util.h"
using namespace std ;

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

//--------------------------------------------------------------------
void lexico_stack (int & n) {
  stack<int> S ;
  int i; 
  S.push (1);
  while ( !S.empty() ) {
    imprime_alreves (S);
    i = S.top (); 
    if (i < n) 
      S.push (i+1);
    else {
      S.pop () ;
      if ( !S.empty() ) {
        i = S.top (); S.pop () ;
        S.push (i+1);
      } // end if
    } // end if
  } // end while
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>---: 
// Version recursiva
void lexico_stack2(list<int> &L,int j,int n,int &count) {
  if (j==n) {
    printl(L);
    count++;
  } else {
    lexico_stack2(L,j+1,n,count);
    L.push_back(j);
    lexico_stack2(L,j+1,n,count);
    L.pop_back();
  }
}

// wrapper..
void lexico_stack2(int n) {
  list<int> L;
  int count=0;
  lexico_stack2(L,0,n,count);
  // printf("n %d, total lexico_stack2s %d\n",n,count);
}

//--------------------------------------------------------------------
int main() {
  int n = 5 ; 
  lexico_stack(n);
  cout << endl;
  lexico_stack2(n);
  return 0;
}
// -----------------------------------------------------------------


Generated by GNU Enscript 1.6.6.