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