from typing import Generic, TypeVar

T = TypeVar('T')


class Stack(Generic[T]):
    def __init__(self):
        self.top: int = 0
        self.data: list[T] = []

    def push(self, value: T):
        self.data.append(value)
        self.top += 1

    def pop(self) -> T | None:
        if self.top > 0:
            self.top -= 1
            return self.data.pop()
        else:
            return None

    def peek(self) -> T | None:
        if self.top > 0:
            return self.data[self.top - 1]
        else:
            return None

    def is_empty(self) -> bool:
        return self.top == 0

    def size(self) -> int:
        return self.top