Mål: Tillämpa generics för att skapa en datastruktur.

Uppgift:

  1. Skapa en generisk klass Stack som kan lagra valfri typ.
  2. Lägg till metoder: push(item), pop(), peek() och is_empty().
  3. Testa med strängar och sedan med heltal.

Till denna uppgift kan det vara bra att kolla på listor från programmering 1 igen, kommandon för att ta bort eller lägga till saker i en list.

För att komma igång kan ni börja så här, metoderna push och pop är tillagda:

from typing import Generic, TypeVar, List

T = TypeVar('T')  # T kan vara vilken typ som helst (t.ex. int, str)

class Stack(Generic[T]):
    def __init__(self):
        self.items: List[T] = []  # Intern lista som lagrar stackens innehåll

    def push(self, item: T) -> None:
        # Lägger ett objekt överst på stacken.
        self.items.append(item)

    def pop(self) -> T:
        # Tar bort och returnerar det översta objektet.
        if not self.is_empty():
            return self.items.pop()
        raise IndexError("Pop från tom stack")

raise IndexError – vad är det?

I Python används raise för att medvetet slänga ett fel (eng. raise an exception) om något går fel i din kod.

I vårt exempel används det för att tala om att man försöker ta bort eller titta på ett värde i en tom stack – något som inte är tillåtet:

Detta gör att programmet kraschar med ett tydligt felmeddelande, så man vet vad som gick fel.

Bra att veta:

  • IndexError är ett inbyggt Python-fel som normalt används för fel i listindex.
  • Du kan använda egna meddelanden för att göra felet mer informativt.
  • Vi kastar felet själva eftersom vi inte vill att pop() returnerar något konstigt (som None) om stacken är tom.