Comunidad de diseño web y desarrollo en internet online

Pila LIFO (estructuras de datos -- parte I)

Citar            
MensajeEscrito el 07 Sep 2005 08:59 pm
Saludos.
En estos dias he estado tabajando con estructuras de datos en AS y ya que me funcionan algunas (mi objetivo principal es trabajar con colecciones) quiero incluir el código aquí para quien pueda servir :wink:

En este post incluyo el código de implementación de una pila LIFO.
Una pila o cola o stak tipo LIFO (Last In, First Out) es una lista lineal que almacena una serie sucesiva, continua, de celdas en la que se tiene acceso a un extremo de la lista y por tanto la consulta, las inserciones y las eliminaciones se llevan a cabo sólo por ese extremo.

Esta estructura de datos es aplicable a ciertos sistemas de consulta, algunos sistemas de manejo de inventario, entre otros.

el código para la implementación es:

Código :

class Lifo
{
   private var _tope:Number = 0;
   private var _base:Number = 0;
   private var _minimo:Number = 0;
   private var _maximo:Number = 0;
   private var _estado:String = new String("Vacia");
   private var _contenedor:Array;
   private var _longitudNodo:Number = 1;

   public function Lifo(tam:Number)
   {
      _contenedor = new Array(tam);
      setMinimo(0);
      setMaximo(tam);
      setBase(minimo);
      _tope = minimo - longitudNodo;
      setEstado("vacia");
   }

   private function setMinimo(newValue:Number)
   {
      _minimo = newValue;
   }
   private function setMaximo(newValue:Number)
   {
      _maximo = newValue - longitudNodo;
   }
   private function setBase(newValue:Number)
   {
      _base = newValue;
   }
   private function setEstado(newValue:String)
   {
      _estado = newValue;
   }
   
   private function incrementeTope()
   {
      _tope++;
   }
   private function decrementeTope()
   {
      _tope--;
   }
   function set longitudNodo(newValue:Number)
   {
      _longitudNodo = newValue;
   }
   function get longitudNodo():Number
   {
      return _longitudNodo;
   }

   function get minimo():Number
   {
      return _minimo;
   }
   function get maximo():Number
   {
      return _maximo;
   }
   function get base():Number
   {
      return _base;
   }
   function get tope():Number
   {
      return _tope;
   }
   function get estado():String
   {
      return _estado;
   }

   public function insertar(Dato)
   {
      if(estado == "llena")
      {
         throw new Error("Error 3. La pila está llena, no se puede agregar más datos");//trace("Error 3. La pila está llena, no se puede agregar más datos");
      }
      else
      {
         incrementeTope();
         _contenedor[tope] = Dato;
         trace("dato " + tope + "(" + Dato + ") agregado");
         if(tope >= maximo)
         {
            setEstado("llena");
         }
         else
         {
            if(estado == "vacia")
            {
               setEstado("normal");
            }
         }
      }
   }
   
   public function eliminar()
   {
      if(estado == "vacia")
      {
         throw new Error("Error 2. La pila está vacia, no se puede eliminar datos");//trace("Error 2. La pila está vacia, no se puede eliminar datos");
      }
      else
      {
         _contenedor.splice(tope,1);
         decrementeTope();
         if(tope < base)
         {
            setEstado("vacia");
         }
         else
         {
            if(estado == "llena")
            {
               setEstado("normal");
            }
         }
      }
   }
   
   public function consultar()
   {
      if(estado == "vacia")
      {
         throw new Error("Error 1. La pila está vacia");//trace("Error 1. La pila está vacia");
      }
      else
      {
         var retorno = _contenedor[tope];
         return retorno;
      }
   }
}
Ésta es una de las tantas formas de implementación, este código debe guardarse en un archivo de nombre Lifo.as, sin embargo para sus implementaciones pueden llevar a cabo los cambios que juzguen pertinentes, en post posteriores explicaré el código.
ya se está viendo como largo el post :lol: Claro está si les interesa la explicación del código zzz:

Por henker

50 de clabLevel



Genero:Masculino  

Colombia

opera
Citar            
MensajeEscrito el 07 Sep 2005 09:41 pm
A ver PILA es LIFO(ultimo en entrar, primero en salir) y COLA es FIFO(Primera en entrar, primero en salir)

PILA y COLA son dos comportamientos ligeramente diferentes :wink:

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 07 Sep 2005 09:46 pm
Disculpen aprovechando el post, que son los getters y setters.. :oops: :oops: :oops: :oops:

Por rolv

Claber

2000 de clabLevel

3 tutoriales

 

msie
Citar            
MensajeEscrito el 07 Sep 2005 10:17 pm
son propiedades que se definen para acceder a los atributos de la clase, esto es, por medio de funciones set se establece un valor en un atributo y por medio de get se consulta el valor.

Por ejemplo yo establecí todos los atributos privados y solo se pueden consultar a través de getters, asi me aseguro de que no se acceda de forma indiscriminada a los atributos clave.

Por henker

50 de clabLevel



Genero:Masculino  

Colombia

opera
Citar            
MensajeEscrito el 07 Sep 2005 10:43 pm
Muchas gracias, ahora, si no es mucho pedir, podrias señalar alguna parte del code, donde se aplica,
Te agradezco de antemano tu ayuda, mil gracias..de verdad :-)

Por rolv

Claber

2000 de clabLevel

3 tutoriales

 

msie
Citar            
MensajeEscrito el 07 Sep 2005 11:13 pm
Un dato adicional, Flash YA implementa pilas y colas

Los mismos arrays tienen las funciones "push" y "pop" nativas de las pilas y las funciones "unshift" y "shift", nativas de las colas

En un array se puede colocar cualquier tipo de dato asi que son totalmente flexibles.

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

firefox
Citar            
MensajeEscrito el 07 Sep 2005 11:22 pm
aqui encontre algo ..espero me sirva, y a quines lean el post y no sepan tanto, del asunto (como yo)...
getters y setters en flash

Por rolv

Claber

2000 de clabLevel

3 tutoriales

 

msie
Citar            
MensajeEscrito el 07 Sep 2005 11:28 pm
ok :wink:
Esto era algo que iva a hacer mas tarde, pero.... aquí va.

Resulta que en la clase están definidas los siguientes atributos:

Código :

   private var _tope:Number = 0; 
   private var _base:Number = 0; 
   private var _minimo:Number = 0; 
   private var _maximo:Number = 0; 
   private var _estado:String = new String("Vacia"); 
   private var _contenedor:Array; 
   private var _longitudNodo:Number = 1;

el atributo _tope es la posición del último dato ingresado a la pila
el atributo _base es la posición del primer elemento ingresado a la pila
El atributo _minimo es la posición desde donde se empieza a almacenar la información
El atributo _maximo es la maxima capacidad que almacena la pila
El atributo _estado es una cadena que permite saber si la pila está vacía, tiene datos o está llena
El atributo _contenedor es la propiedad que almacena los datos de la pila
El atributo _logitudNodo es el tamaño de cada dato ingresado(esto expresado en casillas)


dado el caso de que se instancie un objeto de la clase Lifo, por ejemplo

Código :

var pila:Lifo = new Lifo(4);
el tratar de acceder a cualquier atributo directamente generará error porque son privados,

Código :

var pila:Lifo = new Lifo(4);
pila._base = 0;
var long:Number = pila._longitudNodo
este código genera error pues en la asignacion (pila._base=0) se trata de cambiar el valor de un atributo privado; cuando se trata de leer la longitud del nodo (pila._longitudNodo) tambiés se porque el atributo es privado.
Para poder realizar una asignación a un atributo privado se crea una propiedad set, por ejemplo

Código :

function set longitudNodo(newValue:Number)
   {
      _longitudNodo = newValue;
   }
y para realizar una lectura de un atributo privado se crea una propiedad get, por ejemplo

Código :

function get longitudNodo():Number
   {
      return _longitudNodo;
   }
de forma que el código que genera error quedaría corregido así

Código :

var pila:Lifo = new Lifo(4);
pila.longitudNodo = 0;
var long:Number = pila.longitudNodo


[¡]PD: function set Nombre_prop() != function setNombre_prop()[/i]

Por henker

50 de clabLevel



Genero:Masculino  



Ultima edición por henker el 07 Sep 2005 11:37 pm, editado 2 veces

Colombia

opera
Citar            
MensajeEscrito el 07 Sep 2005 11:33 pm

Freddie® escribió:

Un dato adicional, Flash YA implementa pilas y colas

Los mismos arrays tienen las funciones "push" y "pop" nativas de las pilas y las funciones "unshift" y "shift", nativas de las colas

En un array se puede colocar cualquier tipo de dato asi que son totalmente flexibles.
eso es cierto sin embargo los array permiten el acceso directo a todos sus elemento y la pila no, no quiero decir con esto que el array no se us, de hecho es la base de la pila, pero si la aplicación que se está diseñando requiere el uso de una pila es porque se quiere restringir el acceso a los datos almacenados de tal forma que el acceso a ellos se rija por el comportamiento LIFO.

Por otro lado, como dije en el primer post... mi idea es crear una estructura coleccion... y las pilas y colas las implementé de camino... :wink:

Por henker

50 de clabLevel



Genero:Masculino  

Colombia

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.