Lo stack (o pila) è una struttura dati LIFO (Last In First Out) che prevede solo due operazioni: inserimento dopo l’ultimo elemento (push) e cancellazione (pop) dell’ultimo elemento. Non sono previste altre modalità di accesso, visita, inserimento o rimozione.

Si può implementare con una lista di Python, in cui il costo di entrambe le operazioni è :

class Pila:
	
	def __init__(self):
		self.elementi = []
	
	def push(self, x):
		self.elementi.append(x)
	
	def pop(self):
		if self.elementi:
			return self.elementi.pop()

Oppure si può implementare con le linked list:

Push:

0. cima dello stack -> ...
1. (creazione) Nuovo nodo
2. Nuovo nodo -> cima dello stack -> ...
3. Nuovo nodo = cima dello stack
4. risultato: (nuova) cima dello stack -> ...

Pop:

1. cima dello stack -> next -> ...
2. valore = cima dello stack
3. next -> ... (bypass della cima dello stack)
4. garbage collection: la cima viene eliminata perché inaccessibile
5. return valore
class Nodo:
    def __init__(self, valore):
        self.valore = valore
        self.next = None
 
class Stack:
    def __init__(self):
        self.top = None  # cima della pila = testa della lista
 
    def push(self, valore):
        nuovo_nodo = Nodo(valore)
        nuovo_nodo.next = self.top
        self.top = nuovo_nodo
 
    def pop(self):
        if self.top is None:
            raise IndexError("Stack vuoto")
        valore = self.top.valore
        self.top = self.top.next
        return valore
 
    def is_empty(self):
        return self.top is None
 
    def peek(self):
        if self.top is None:
            raise IndexError("Stack vuoto")
        return self.top.valore