Stos (ang. stack) działa na zasadzie LIFO (Last In, First Out) — ostatni element włożony jest pierwszym zdejmowanym. Myśl o stosie talerzy: bierzesz zawsze z wierzchu.
W Pythonie zwykła lista działa jak stos od razu (append() = push, pop() = pop) — obie operacje są O(1).
Kolejka działa na zasadzie FIFO (First In, First Out) — tak jak kolejka w sklepie: kto pierwszy stanął, pierwszy zostanie obsłużony. Do wydajnej implementacji używamy collections.deque zamiast zwykłej listy (usuwanie z początku listy jest O(n), a z deque jest O(1)).
W przeciwieństwie do tablicy, elementy listy nie leżą obok siebie w pamięci — każdy węzeł przechowuje wartość oraz wskaźnik (referencję) do następnego węzła. Dodawanie na początku jest O(1), ale dostęp do n-tego elementu wymaga przejścia od początku — O(n).
ONP (zapis postfiksowy) zapisuje operatory po argumentach, np. wyrażenie (3 + 4) * 2 w ONP to 3 4 + 2 *. Ten zapis pozwala obliczyć wynik bez nawiasów i bez znajomości priorytetów operatorów, wykorzystując stos: liczby odkładamy na stos, a napotykając operator — zdejmujemy dwa górne elementy, wykonujemy działanie i wynik odkładamy z powrotem.
Wykorzystując klasę Stos, napisz funkcję sprawdzającą, czy w tekście nawiasy są poprawnie domknięte i zagnieżdżone (np. "(a+[b*c])" jest poprawne, a "(a+[b)]" nie).
Zapisz w notacji ONP wyrażenie (5 - 2) * (3 + 1), a następnie zweryfikuj wynik funkcją oblicz_onp.
ONP: 5 2 - 3 1 + * → wynik: (5-2) × (3+1) = 3 × 4 = 12
1. Stos działa na zasadzie:
2. Która struktura Pythona jest zalecana do efektywnej implementacji kolejki?
3. Wyrażenie ONP "3 4 +" oznacza: