cadena_pq.cpp

// $Id$

/*
  COMIENZO DE DESCRIPCION

  Determinar si una cadena {\tt z} es de la forma {\tt z = x y}, 
  donde {\tt y} es la cadena inversa (o espejo) de la cadena 
  {\tt x}, ignorando los espacios en blanco. 
  Emplear una cola y una pila auxiliares.
  keywords: lista, pila, cola

  FIN DE DESCRIPCION 
*/
// -----------------------------------------------------------------
#include <iostream>
#include <list>
#include <stack>
#include <queue>
using namespace std;

// -------------------------------------------------------------------
char fin_cadena ='#';
char blanco = ' ';

// -------------------------------------------------------------------
bool cadena_pq (list <char> & L1, list <char> & L2) {
  queue <char> Q;
  stack <char> S;
  list<char>::iterator p;
  list<char>::iterator q;
  char x, y ;
  bool b ;

  // verifica que las longitudes de las listas "L1" e "L2" sean iguales
  b = ( L1.size() == L2.size () ) ;
  if (!b) { 
    cout << endl ;
    cout << "error: listas de longitudes distintas" << endl; 
    return false ; 
  }
  cout << endl ;

  // pone cada caracter de la cadena "x" en la pila S
  p = L1.begin();
  while ( p != L1.end () ) {
    x = *p ;
    S.push (x) ;
    p++;
  } // end while

  // pone cada caracter de la cadena "y" en la cola Q
  q = L2.begin();
  while ( q != L2.end () ) {
    y = *q;
    Q.push (y) ;
    q++;
  } // end while

  // itera comparando el tope de la pila y el frente de la cola
  while (!S.empty () && !Q.empty () ) {
    x = S.top ()   ; S.pop (); // no olvidar "desapilar" !! 
    y = Q.front () ; Q.pop (); // no olvidar "descolar"  !!
    cout << "tope (pila) = " << x << " ; frente (cola) = " << y << endl;
    if (x != y) { return false ; } 
  } //
  return true ;
}

// -------------------------------------------------------------------
int main (){
  list <char> L1, L2 ;
  char x, y ;
  bool b ;

  // lee cada caracter de la cadena "x" y lo pone en la lista "L1"
  cout << endl ;
  cout << "lee cada caracter de la cadena x (# para salir)" << endl ;
  x = blanco ;
  while (x != fin_cadena) {
    cout << "cadena x : ? " ; cin >> x ;
    b = (x != fin_cadena && x != blanco) ;
    if (b) L1.insert (L1.end(), x);
  } ;

  // lee cada caracter de la cadena "x" y lo pone en la lista "L2"
  cout << endl ;
  cout << "lee cada caracter de la cadena y (# para salir)" << endl ;
  y = blanco ;
  while (y != fin_cadena) {
    cout << "cadena y : ? " ; cin >> y ;
    b = (y != fin_cadena && y != blanco) ;
    if (b) L2.insert (L2.end(), y);
  } ;

  // test
  b = cadena_pq (L1,L2) ;
  cout << endl ;
  if (b) cout << "la cadena 'y' es espejo de la cadena 'x' ";
  else   cout << "la cadena 'y' NO es espejo de la cadena 'x' ";
  cout << endl ;

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



Generated by GNU Enscript 1.6.6.