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

Структуры данных: cтек

17 октября 2020

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


Пример на PHP

class Stack
{
    private array $stack = [];

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

        return $this;
    }

    public function pop(): int
    {
        if ($this->isEmpty()) {
            throw new RunTimeException("Stack is empty");
        } else {
            return array_pop($this->stack);
        }
    }

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


$stack = new Stack();
$stack->push(2)->push(5)->push(3);

echo $stack->pop() . PHP_EOL; // 3
echo $stack->pop() . PHP_EOL; // 5


Пример на Go

package main

import (
   "errors"
   "fmt"
)

type Stack struct {
   items []int
}

func (s *Stack) Push(item int) *Stack {
   s.items = append(s.items, item)

   return s
}

func (s *Stack) Pop() (int, error) {
   if s.IsEmpty() {
      return 0, errors.New("stack is empty")
   }

   stackLen := len(s.items)
   item := s.items[stackLen-1]
   s.items = s.items[:stackLen-1]

   return item, nil
}

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

func main() {
   stack := Stack{}
   stack.Push(2).Push(5).Push(3)

   fmt.Println(stack.Pop()) // 3
   fmt.Println(stack.Pop()) // 5
}


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

package main

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

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

func NewStack() *Stack {
   return &Stack{mu: sync.Mutex{}}
}

func (s *Stack) Push(item int) *Stack {
   s.mu.Lock()
   defer s.mu.Unlock()

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

   return s
}

func (s *Stack) Pop() (int, error) {
   if s.IsEmpty() {
      return 0, errors.New("stack is empty")
   }

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

   stackLen := len(s.items)
   item := s.items[stackLen-1]
   s.items = s.items[:stackLen-1]

   return item, nil
}

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

   return len(s.items) == 0
}

func main() {
   stack := NewStack()
   stack.Push(2).Push(5).Push(3)

   fmt.Println(stack.Pop()) // 3
   fmt.Println(stack.Pop()) // 5
}

 


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