Дек



Дек - структура данных, выполняющая быстрое удаление/вставку первого и последнего элемента.

Листинг Delphi

type DequeData = integer;
     PDequeNode = ^DequeNode;
     DequeNode = record
       key : DequeData;
       prev, next : PDequeNode;
     end;
     Deque = object
       public
         head, tail : PDequeNode;
       public
         constructor Create;
         function Empty : boolean;
         procedure WriteHead(x : DequeData);
         procedure WriteTail(x : DequeData);
         function ReadHead : DequeData;
         function ReadTail : DequeData;
     end;

implementation

constructor Deque.Create;
  begin
    head := nil;
    tail := nil;
  end;

  function Deque.Empty : boolean;      // Пуст ли дек?
  begin
    Result := (head = niland (tail = nil);
  end;

  procedure Deque.WriteHead(x : DequeData);  // Добавление элемента в начало
    var T : PDequeNode;
  begin
    new(T);
    T^.key := x;
    T^.prev := nil;
    T^.next := head;
    head := T;
    if tail <> nil
      then T^.next^.prev := T
      else tail := T;
  end;

  procedure Deque.WriteTail(x : DequeData);  // Добавление элемента в конец
    var T : PDequeNode;
  begin
    new(T);
    T^.key := x;
    T^.next := nil;
    T^.prev := tail;
    tail := T;
    if head <> nil
      then T^.prev^.next := T
      else head := T;
  end;

  function Deque.ReadHead : DequeData;  // Извлечение элемента с начала
    var T : PDequeNode;
  begin
    if Empty
      then { UNDERFLOW }
           exit;
    Result := head^.key;
    if head^.next <> nil
      then head^.next^.prev := nil
      else tail := nil;
    T := head;
    head := T^.next;
    dispose(T); 
  end;

  function Deque.ReadTail : DequeData; // Извлечение элемента с конца
    var T : PDequeNode;
  begin
    if Empty
      then { UNDERFLOW }
           exit;
    Result := tail^.key;
    if tail^.prev <> nil
      then tail^.prev^.next := nil
      else head := nil;
    T := tail;
    tail := T^.prev;
    dispose(T);
  end;


08.12.2007, 19:15

По всем вопросам обращаться: rumterg@gmail.com