Pino (tietorakenne): LIFO-malli, toimintaperiaate ja esimerkit
Pino on yksi tietojenkäsittelytieteen tärkeimmistä tietorakenteista. Jos haluat ymmärtää, miten pino toimii, ajattele pelikorttipakkaa, joka on kuvapuoli alaspäin. Pääsemme helposti käsiksi vain päällimmäisenä olevaan korttiin. Kun haluamme katsoa päällimmästä korttia, voimme tehdä kaksi asiaa: voimme katsoa sitä, mutta jättää sen pinoon, tai voimme ottaa sen pois. Kun otamme ylimmän objektin pois, otamme sen pois pinosta. Jos haluamme lisätä toisen kortin pinon yläosaan, työnnämme sen.
Pino on nimeltään LIFO-kokoelma (last-in-first-out). Tämä tarkoittaa sitä, että viimeiseksi lisätty (työnnetty) asia on ensimmäinen asia, joka vedetään (pudotetaan) pois. Jos korttipinoomme viimeksi laitettu kortti oli ässä, ensimmäinen kortti, jonka vedämme pois, on sama ässä.
Perustoiminnot
- push (työnnä): lisää alkio pinon yläosaan.
- pop (ota/poista): poistaa ja palauttaa pinon yläosan alkion.
- peek/top (kurkista): palauttaa pinon yläosan alkion ilman poistamista.
- isEmpty: tarkistaa, onko pino tyhjä.
Yksinkertaista pseudokoodia:
function push(pino, arvo): pino[top+1] = arvo top = top + 1 function pop(pino): if top == -1: error "tyhjä pino" arvo = pino[top] top = top - 1 return arvo function peek(pino): if top == -1: error "tyhjä pino" return pino[top]
Toteutustavat ja tehokkuus
Pino voidaan toteuttaa monella tavalla, yleisimmät ovat:
- Taulukko (array): yksinkertainen ja nopea. Operaatiot push/pop ovat amortisoituna O(1), kun taulukko kasvaa tarpeen mukaan.
- Linkitetty lista: jokainen solmu viittaa seuraavaan; push/pop voidaan tehdä O(1) ilman uudelleenkopiointia, ja koko pino voi kasvaa dynaamisesti.
Aika- ja tilavaativuus ovat yleensä O(1) per push/pop ja O(n) tilan vaatimus n alkioon.
Käyttökohteet ja esimerkit
- Kutsupino (call stack): ohjelmoinnin ajonaikainen pino, joka seuraa funktiokutsuja ja paikallisia muuttujia.
- Syvyyssuuntainen haku (DFS): graafeissa käytetään pinoa solmujen läpikäyntiin.
- Lausekkeiden arviointi: infix->postfix-muunnos ja postfix-evaluointi käyttävät pinoa sulkujen ja operaattoreiden käsittelyyn.
- Kumoa-toiminto (undo): tekstieditoreissa ja muissa sovelluksissa edellisten tilojen tallentaminen pinoon.
- Selaimen historia: takaisin-nappi voidaan mallintaa pinoilla.
Esimerkki: sulkujen tarkistus
Yksinkertainen käyttötapaus on tarkistaa, ovatko sulut oikein tasapainossa. Algoritmi käy läpi merkkijonon ja lisää vasemmat sulut pinoon; oikeaa sulkua kohdattaessa verrataan pinon huippua vastaavaan vasempaan sulkuun. Lopuksi pino tulee olla tyhjä.
for merkki in merkkijono: if merkki on vasen_sulku: push(pino, merkki) else if merkki on oikea_sulku: if isEmpty(pino) or not vastaavat(pop(pino), merkki): return false return isEmpty(pino)
Rajoitukset ja huomioitavaa
- Pino-ylivuoto (stack overflow): tavallisessa taulukko-toteutuksessa kiinteä koko voi täyttyä. Dynaamisessa muistinhallinnassa rekursio voi aiheuttaa kutsupinon ylivuodon.
- Säikeiden turvallisuus: jaetun pinon käyttö monessa säikeessä vaatii synkronointia.
- Ei satunnaista pääsyä: pinosta voi helposti päästä käsiksi vain viimeiseen lisättyyn alkioon; satunnaiseen indeksiin pääsy ei ole tehokasta.
Lisätietoja ja vinkkejä
- Opettele sekä taulukko- että linkitetty-lista-toteutukset — kumpikin on hyödyllinen eri tilanteissa.
- Harjoitustehtävänä: toteuta pino ja käytä sitä infix-lausekkeen arviointiin tai DFS:ään.
- Muista erottaa looginen pino (kuten sovellustason undo-historia) ja kutsupino (runtime call stack) — ne toimivat saman periaatteen mukaan, mutta niiden hallinta ja rajoitukset voivat poiketa.


Kaksi toimintoa pinossa: push ja pop.
Historia
Saksalainen Friedrich L. Bauer ehdotti pinoa ensimmäisen kerran vuonna 1955 ja patentoi sen vuonna 1957. Saman konseptin kehitti itsenäisesti samoihin aikoihin australialainen Charles Leonard Hamblin.
Muut toiminnot
Nykyaikaisissa tietokonekielissä pino on yleensä toteutettu useammilla operaatioilla kuin vain "push" ja "pop". Joissakin toteutuksissa on funktio, joka palauttaa pinon nykyisen pituuden. Toinen tyypillinen apuoperaatio on "top" (tunnetaan myös nimellä "peek"), joka voi palauttaa pinon nykyisen ylimmän elementin poistamatta sitä. Toinen yleinen operaatio on "dup", joka tekee kopion pinon ylimmässä kohdassa olevasta elementistä.
Aiheeseen liittyvät sivut
- Pinoamiskone