Bicola

tipo de cola

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 -