Структуры данных: очередь
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)