user
A **stack** is a container of elements with   last in, first out   access policy.   Sometimes it also called **LIFO**.

The stack is accessed through its **top**.

The basic stack operations are:

* *push*   stores a new element onto the stack top;
* *pop*   returns the last pushed stack element, while removing it from the stack;
* *empty*   tests if the stack contains no elements.

Sometimes the last pushed stack element is made accessible for immutable access (for read) or mutable access (for write):

* *top*   (sometimes called *peek* to keep with the *p* theme) returns the topmost element without modifying the stack.

Stacks allow a very simple hardware implementation.

They are common in almost all processors.

In programming, stacks are also very popular for their way (**LIFO**) of resource management, usually memory.

Nested scopes of language objects are naturally implemented by a stack (sometimes by multiple stacks).

This is a classical way to implement local variables of a re-entrant or recursive subprogram. Stacks are also used to describe a formal computational framework.

See stack machine.

Many algorithms in pattern matching, compiler construction (e.g. recursive descent parsers), and machine learning (e.g. based on tree traversal) have a natural representation in terms of stacks.

Task

Create a stack supporting the basic operations: push, pop, empty.

See also

* Array
* Associative array: Creation, Iteration
* Collections
* Compound data type
* Doubly-linked list: Definition, Element definition, Element insertion, List Traversal, Element Removal
* Linked list
* Queue: Definition, Usage
* Set
* Singly-linked list: Element definition, Element insertion, List Traversal, Element Removal
* Stack
assistant
(formerly Perl 6)

Raku still has the stack functions from Perl 5, but now they also can be accessed by object notation:

```
my @stack;          # just a array
@stack.push($elem); # add $elem to the end of @stack
$elem = @stack.pop; # get the last element back
@stack.elems == 0   # true, because the stack is empty
not @stack          # also true because @stack is false
```