Stack Implementation Using Linked List in Python

In this source code example, we will write a code to implement the Stack data structure using the Linked List data structure in Python.

The singly linked list is a linear data structure in which each element of the list contains a pointer that points to the next element in the list. Each element in the singly linked list is called a node. Each node has two components: data and a pointer next which points to the next node in the list. 

Stack Implementation Using Linked List in Python

""" A Stack using a linked list like structure """
from __future__ import annotations

from collections.abc import Iterator
from typing import Generic, TypeVar

T = TypeVar("T")

class Node(Generic[T]):
    def __init__(self, data: T):
        self.data = data
        self.next: Node[T] | None = None

    def __str__(self) -> str:
        return f"{self.data}"


class LinkedStack(Generic[T]):

    def __init__(self) -> None:
        self.top: Node[T] | None = None

    def __iter__(self) -> Iterator[T]:
        node = self.top
        while node:
            yield node.data
            node = node.next

    def __str__(self) -> str:
        return "->".join([str(item) for item in self])

    def __len__(self) -> int:
        return len(tuple(iter(self)))

    def is_empty(self) -> bool:
        return self.top is None

    def push(self, item: T) -> None:
        node = Node(item)
        if not self.is_empty():
            node.next = self.top
        self.top = node

    def pop(self) -> T:
        if self.is_empty():
            raise IndexError("pop from empty stack")
        assert isinstance(self.top, Node)
        pop_node = self.top
        self.top = self.top.next
        return pop_node.data

    def peek(self) -> T:
        if self.is_empty():
            raise IndexError("peek from empty stack")

        assert self.top is not None
        return self.top.data

    def clear(self) -> None:
        self.top = None


if __name__ == "__main__":
        
        stack = LinkedStack()
        stack.push("a")
        stack.push("b")
        stack.push("c")
        stack.push("d")
        stack.push("e")
        print(str(stack))
        print(len(stack))
        print(stack.is_empty())
        print(stack.pop())
        print(str(stack))
        print(stack.peek())
        print(stack.clear())

Output:

e->d->c->b->a
5
False
e
d->c->b->a
d
None

Push Operation

  • In a push operation, we add an element/node to the top of the stack.

    def push(self, item: T) -> None:
        node = Node(item)
        if not self.is_empty():
            node.next = self.top
        self.top = node

Pop Operation

  • Remove the top element/node from the stack 

    def pop(self) -> T:
        if self.is_empty():
            raise IndexError("pop from empty stack")
        assert isinstance(self.top, Node)
        pop_node = self.top
        self.top = self.top.next
        return pop_node.data

Related Data Structures in Python


Comments