Статья
Структуры данных: очередь

Структуры данных: очередь

10 октября 2020

Очередь представляет собой структуру, работающую по принципу FIFO (first in - first out).


Пример на PHP

class Queue
{
    private array $queue = [];

    public function enqueue(int $item): self
    {
        array_push($this->queue, $item);

        return $this;
    }

    public function dequeue(): int
    {
        if ($this->isEmpty()) {
            throw new RunTimeException("Queue is empty");
        } else {
            return array_shift($this->queue);
        }
    }

    public function isEmpty(): bool {
        return empty($this->queue);
    }
}


$queue = new Queue();
$queue->enqueue(2)->enqueue(5)->enqueue(3);

echo $queue->dequeue() . PHP_EOL; // 2
echo $queue->dequeue() . PHP_EOL; // 5


Пример на Go

package main

import (
   "errors"
   "fmt"
)

type Queue struct {
   items []int
}

func (s *Queue) Enqueue(item int) *Queue {
   s.items = append(s.items, item)

   return s
}

func (s *Queue) Dequeue() (int, error) {
   if s.IsEmpty() {
      return 0, errors.New("queue is empty")
   }

   item := s.items[0]
   s.items = s.items[1:]

   return item, nil
}

func (s *Queue) IsEmpty() bool {
   return len(s.items) == 0
}

func main() {
   queue := Queue{}
   queue.Enqueue(2).Enqueue(5).Enqueue(3)

   fmt.Println(queue.Dequeue()) // 2
   fmt.Println(queue.Dequeue()) // 5
}


Пример на Go (потокобезопасная версия)

package main

import (
   "errors"
   "fmt"
   "sync"
)

type Queue struct {
   mu    sync.Mutex
   items []int
}

func NewQueue() *Queue {
   return &Queue{mu: sync.Mutex{}}
}

func (s *Queue) Enqueue(item int) *Queue {
   s.mu.Lock()
   defer s.mu.Unlock()

   s.items = append(s.items, item)

   return s
}

func (s *Queue) Dequeue() (int, error) {
   if s.IsEmpty() {
      return 0, errors.New("queue is empty")
   }

   s.mu.Lock()
   defer s.mu.Unlock()

   item := s.items[0]
   s.items = s.items[1:]

   return item, nil
}

func (s *Queue) IsEmpty() bool {
   s.mu.Lock()
   defer s.mu.Unlock()

   return len(s.items) == 0
}

func main() {
   queue := NewQueue()
   queue.Enqueue(2).Enqueue(5).Enqueue(3)

   fmt.Println(queue.Dequeue()) // 2
   fmt.Println(queue.Dequeue()) // 5
}

 


Источники:
https://en.wikipedia.org/wiki/Queue_(abstract_data_type)