Bicola

De Wikipedia, la enciclopedia libre

La bicola o doble cola es un tipo de cola especial que permiten la inserción y eliminación de elementos de ambos extremos de la cola.

Puede representarse a partir de un vector y dos índices, siendo su representación más frecuente una lista circular doblemente enlazada.

Todas las operaciones de este tipo de datos tienen coste constante.

Especificación de colas dobles en maude[editar]

fmod COLA-DOBLE {X :: TRIV} is
	protecting NAT .
	sorts ColaDobleNV{X} ColaDoble{X} .
	subsort ColaDobleNV{X} < ColaDoble{X} .
        ***generadores
	op crear : -> ColaDoble{X} [ctor] .
	op encolarIzq : X$Elt ColaDoble{X} -> ColaDobleNV{X} [ctor] .
        ***constructores
	op encolarDch : X$Elt ColaDoble{X} -> ColaDobleNV{X} .¡
	op extraerIzq : ColaDoble{X} -> ColaDoble{X} .
	op extraerDch : ColaDoble{X} -> ColaDoble{X} .
        ***selectores
	op frenteIzq : ColaDobleNV{X} -> X$Elt .
	op frenteDch : ColaDobleNV{X} -> X$Elt .

	vars E E1 E2 : X$Elt .
	vars C : ColaDoble{X} .
	vars CNV : ColaDobleNV{X} .

	eq encolarDch(E, crear) = encolarIzq (E, crear) .
	eq encolarDch(E1, encolarIzq(E2, C)) = encolarIzq(E2, encolarDch(E1, C)) .
	eq extraerIzq(crear) = crear .
	eq extraerIzq(encolarIzq(E, C)) = C .
	eq extraerDch(crear) = crear .
	eq extraerDch(encolarIzq(E, crear)) = crear .
	eq extraerDch(encolarIzq(E, C)) = encolarIzq(E, extraerDch(C)) .
	eq frenteIzq(encolarIzq(E, C)) = E .
	eq frenteDch(encolarIzq(E, crear)) = E .
	eq frenteDch(encolarIzq(E, CNV)) = frenteDch(CNV) .
endfm

Especificación de colas dobles en java[editar]

// ArrayCircularQueue.java

package com.javajeff.cds;

public class ArrayCircularQueue implements Queue {
private int front = 0, rear = 0;
private Object [] queue;

public ArrayCircularQueue (int maxElements) {
queue = new Object [maxElements];
}

public void insert (Object o) {
int temp = rear;
rear = (rear + 1) % queue.length;
if (front == rear) {
rear = temp;
throw new FullQueueException ();
}
queue [rear] = o;
}

public boolean isEmpty () {
return front == rear;
}

public boolean isFull () {
return ((rear + 1) % queue.length) == front;
}

public Object remove () {
if (front == rear)
throw new EmptyQueueException ();
front = (front + 1) % queue.length;
return queue [front];
}
}

Especificación de colas dobles en C++[editar]

// coladoble.hpp
#ifndef INCLUIDO_CoLaDobLe_
#define INCLUIDO_CoLaDobLe_

class ColaDoble 
{
  public:
  struct TAnillo{                        //Esta estructura se puede modificar según la conveniencia del programador que la use
    unsigned int x, y;                   //sin necesidad de modificar el .cpp
   };                                    //Si no se quiere usar una estructura se deberá hacer un typedef TAnillo

   enum TExtremo {frente, final};
   ColaDoble();                           //Constructor se llama automáticamente.
   ~ColaDoble();                          //Destructor se llama automáticamente.
   bool EstaVacia() const;                //Devuelve true si esta vacía la cola
   void Encolar(const TAnillo &a, TExtremo ext=final);//Añade un elemento por el extremo apuntado por ext
   void Desencolar(TExtremo ext=frente);  //Quita un elemento por el extremo apuntado por ext
   bool Valor(TAnillo &a, TExtremo ext=frente) const;  //Devuelve el valor del extremo apuntado por ext, NO ELIMINA NADA DE LA COLA
										 //para eliminar y consultar el siguiente se debera usar Desencolar()
   
  private:
   struct NodoCD 
   {
     TAnillo an; 
     NodoCD *sig;
   }; 
   NodoCD *cabeza;
   NodoCD *cola;
};
#endif

// coladoble.cpp
#include "coladoble.hpp"

ColaDoble::ColaDoble()
: cabeza(0), cola(0)
{
}

ColaDoble::~ColaDoble()
{
  NodoCD *aux;

  while (cabeza)
  {
    aux=cabeza->sig;
    delete cabeza;
    cabeza=aux;
  }
}

bool ColaDoble::EstaVacia() const
{
  return cabeza==0;
} 

void ColaDoble::Encolar(const TAnillo &a, TExtremo ext)
{
  NodoCD *nuevo = new NodoCD;
  nuevo->an=a;

  if (cabeza==0){
    cabeza=nuevo;
    cola=nuevo;
    nuevo->sig=0;
  }
  else if(ext==frente){
    nuevo->sig=cabeza;
    cabeza=nuevo;
  }
  else{
    nuevo->sig=0;
    cola->sig=nuevo;
    cola=nuevo;
  }
}

void ColaDoble::Desencolar(TExtremo ext)
{
  NodoCD *aux;

  if(!EstaVacia()){
    if (cabeza==cola){
      delete cabeza;
      cabeza = cola = 0;
    }
    else if (ext==frente){
      aux = cabeza->sig;
      delete cabeza;
      cabeza = aux;
    }
    else{
      aux = cabeza;
      while(aux->sig != cola){
        aux = aux->sig;
      }
      aux->sig = 0;
      delete cola;
      cola = aux;
    }
  }
}

bool ColaDoble::Valor(TAnillo &a, TExtremo ext) const
{
  if (EstaVacia()){
    return false;
  }

  if(ext == frente){
    a=cabeza->an;
  }
  else{
    a=cola->an;
  }
  return true;
}

Véase también[editar]

Enlaces externos[editar]

-Historia de las estructuras de datos -