Pinoa sisään C++ STL esimerkin kanssa

⚡ Älykäs yhteenveto

Pinoa sisään C++ STL toteuttaa LIFO-konttisovittimen, joka lisää ja poistaa elementtejä yhdestä päästä, kiertäenping pohjalla oleva sekvenssisäiliö, kuten deque, vector tai list järjestetyn datan hallintaan.

  • 🔘 LIFO-periaate: std::pino noudattaa viimeisintä sisään ja ensin ulos -järjestystä, joten viimeksi työnnetty elementti on aina ensimmäisenä poistettava.
  • 📦 Säiliösovitin: Pino käärii olemassa olevan sekvenssisäiliön ja käyttää oletusarvoisesti deque-funktiota, kun säilön tyyppiä ei anneta.
  • Ydintoiminnot: push-, pop- ja top-funktiot lisäävät kohteen, poistavat päällimmäisen kohteen ja lukevat päällimmäisen kohteen tässä järjestyksessä.
  • 🔍 Valtion tarkastukset: empty- ja size-funktiot raportoivat, sisältääkö pino elementtejä ja kuinka monta elementtiä se tällä hetkellä tallentaa.
  • 🔁 Lisätoiminnot: emplace- ja swap-funktiot rakentavat elementin paikalleen ja vaihtavat kahden pinon sisällön.
  • 🤖 AI-apu: Tekoälykoodausavustajat, kuten GitHub Copilot, luovat pinoamis-, pop- ja traversal-malleja lyhyen kommentin pohjalta.

Pinoa sisään C++ STL

Mikä on std::stack?

Pino on tietorakenne, joka toimii LIFO-tekniikan (Last In First Out) perusteella. Std::stack sallii elementtien lisäämisen ja poistamisen vain toisesta päästä.

std::stack-luokka on säilöadapteri. Säilöobjektit sisältävät samantyyppistä dataa. Voit luoda pinon useista sekvenssisäilöistä. Jos säilöä ei anneta, oletuksena käytetään deque-säilöä. Säiliösovittimet eivät tue iteraattoreita, joten niitä ei voida käyttää datan käsittelyyn.

Pinon syntaksi

Pinon luomiseksi meidän on sisällytettävä otsikkotiedosto koodissamme. Käytämme sitten tätä syntaksia määrittämään std::stack:

template <class Type, class Container = deque<Type> > class stack;
  • Tyyppi – on std::pinon sisältämän elementin tyyppi. Se voi olla mikä tahansa kelvollinen C++ tyyppi tai jopa käyttäjän määrittämä tyyppi.
  • Kontti – on taustalla olevan säiliöobjektin tyyppi.

Jäsentyypit

Tässä on pinon jäsentyypit:

  • arvotyyppi– Ensimmäinen malliparametri, T. Se osoittaa elementtityypit.
  • säilön_tyyppi– Toinen malliparametri, Container. Se ilmaisee pohjana olevan kontin tyypin.
  • kokotyyppi– Etumerkitön integraalityyppi.

OperaStackissa

A C++ pino tukee seuraavia perustoimintoja:

  • työntää – Se lisää/työntää kohteen pinoon.
  • pop – Se poistaa/pudottaa kohteen pinosta.
  • kurkistaa – Palauttaa pinon päällimmäisen alkion poistamatta sitä.
  • on täynnä – Tarkistaa, onko pino täynnä.
  • on tyhjä – Tarkistaa, onko pino tyhjä.

Pinon toteutus

Seuraavat vaiheet osoittavat, miten pinon päällimmäinen osa siirtyy, kun esineitä työnnetään ja sitten nostetaan esiin:

Vaihe 1) Meillä on aluksi tyhjä pino. Tyhjän pinon huipuksi asetetaan -1.

Vaihe 2) Seuraavaksi olemme työntäneet elementin 5 pinoon. Pinon yläreuna osoittaa elementtiin 5.

Vaihe 3) Seuraavaksi olemme työntäneet elementin 50 pinoon. Pinon päällimmäinen osa siirtyy ja osoittaa elementtiä 50 kohti.

Vaihe 4) Olemme sitten suorittaneet poistooperaation, jossa ylin elementti poistetaan pinosta. Elementti 50 on poistettu pinosta. Pinon ylin elementti osoittaa nyt elementtiin 5.

Pinon toteutus

push() ja pop()

stack::push()-funktio lisää uuden alkion pinon päällimmäiseksi. Pinon koko kasvaa yhdellä lisäyksen jälkeen. Funktion syntaksi on seuraava:

stack.push(value)

Arvo on pinoon lisättävä kohde.

stack::pop()-funktio poistaa pinon päällimmäisen elementin. Tämä on pinon uusin elementti. Pinon kokoa pienennetään yhdellä poiston jälkeen. Tässä on funktion syntaksi:

stack.pop()

Toiminto ei ota parametreja.

Esimerkki 1:

#include <iostream> 
#include <stack> 
using namespace std;
int main() {
	stack<int> st;
	st.push(10);
	st.push(20);
	st.push(30);
	st.push(40);
	
         st.pop();
	st.pop();

	while (!st.empty()) {
		cout << ' ' << st.top();
		st.pop();
	}
}

lähtö:

push() ja pop()

Tässä on kuvakaappaus koodista:

push() ja pop()

Code Selitys:

  1. Sisällytä iostream-otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  2. Sisällytä pinon otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  3. Sisällytä std-nimiavaruus koodiimme käyttääksesi sen luokkia kutsumatta sitä.
  4. Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä tähän toimintoon.
  5. Luo pino st kokonaislukuarvojen tallentamiseksi.
  6. Käytä push()-funktiota lisätäksesi arvon 10 pinoon.
  7. Käytä push()-funktiota lisätäksesi arvon 20 pinoon.
  8. Käytä push()-funktiota lisätäksesi arvon 30 pinoon.
  9. Käytä push()-funktiota lisätäksesi arvon 40 pinoon.
  10. Käytä pop()-funktiota poistaaksesi pinosta ylimmän elementin, eli 40. Yläelementistä tulee nyt 30.
  11. Käytä pop()-funktiota poistaaksesi pinosta ylimmän elementin, eli 30. Yläelementistä tulee nyt 20.
  12. Käytä while-silmukkaa ja tyhjä()-funktiota tarkistaaksesi, onko pino EI tyhjä. ! on EI-operaattori.
  13. Pinon nykyisen sisällön tulostaminen konsoliin.
  14. Kutsu pinon pop()-funktiota.
  15. While-silmukan rungon loppu.
  16. Main()-funktion rungon loppu.

tyhjä(), koko(), top()

Pinoissa on sisäänrakennettuja toimintoja, joiden avulla voit leikkiä pinolla ja sen arvoilla. Nämä sisältävät:

  • tyhjä()– tarkistaa, onko pino tyhjä vai ei.
  • koko()– palauttaa pinon koon eli pinossa olevien elementtien lukumäärän.
  • yläosa()– käyttää pinon yläosassa olevaa elementtiä.

Esimerkki 2:

#include <iostream> 
#include <stack>  
using namespace std;
void createStack(stack <int> mystack)
{
	stack <int> ms = mystack;
	while (!ms.empty())
	{
		cout << '\t' << ms.top();
		ms.pop();
	}
	cout << '\n';
}
int main()
{
	stack <int> st;
	st.push(32);
	st.push(21);
	st.push(39);
	st.push(89);
	st.push(25);

	cout << "The stack st is: ";
	createStack(st);
	cout << "\n st.size() : " << st.size();
	cout << "\n st.top() : " << st.top();
	cout << "\n st.pop() : ";
	st.pop();
	createStack(st);
	return 0;
}

lähtö:

tyhjä(), koko(), top()

Tässä on kuvakaappaus koodista:

tyhjä(), koko(), top()

Code Selitys:

  1. Sisällytä iostream-otsikkotiedosto koodiimme, jotta voit käyttää sen toimintoja.
  2. Sisällytä pinon otsikkotiedosto koodiimme, jotta voit käyttää sen toimintoja.
  3. Sisällytä std-nimiavaruus ohjelmaamme, jotta voit käyttää sen luokkia kutsumatta sitä.
  4. Luo funktio createStack, jota voimme käyttää pinon mystackin luomiseen. Pino sisältää joukon kokonaislukuja.
  5. CreateStack-funktion rungon alku.
  6. Luo mystack-tietotyypin esiintymä ja anna sille nimi ms.
  7. Käytä while-silmukkaa ja tyhjä()-funktiota tarkistaaksesi, onko pino tyhjä.
  8. While-silmukan rungon alku.
  9. Käytä pinon yläosaan tallennettua top()-funktiota. \t-merkki luo uuden välilehden.
  10. Käytä pop()-funktiota poistaaksesi elementin pinon yläosassa.
  11. While-silmukan rungon loppu.
  12. Tulosta tyhjä rivi konsoliin.
  13. CreateStack-funktion rungon loppu.
  14. Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä main()-funktion runkoon.
  15. Toiminnon main() rungon alku.
  16. Luo pinoobjekti st.
  17. Käytä push()-funktiota lisätäksesi elementin 32 pinoon.
  18. Käytä push()-funktiota lisätäksesi elementin 21 pinoon.
  19. Käytä push()-funktiota lisätäksesi elementin 39 pinoon.
  20. Käytä push()-funktiota lisätäksesi elementin 89 pinoon.
  21. Käytä push()-funktiota lisätäksesi elementin 25 pinoon.
  22. Tulosta tekstiä konsoliin.
  23. Kutsu CreateStack-toiminto suorittaaksesi yllä olevat lisäystoiminnot pinoon.
  24. Tulosta pinon koko konsoliin muun tekstin viereen.
  25. Tulosta elementti konsolin pinon yläosassa.
  26. Tulosta tekstiä konsoliin.
  27. Poista pinon yläosassa oleva elementti. Sitten se palauttaa pinossa jäljellä olevat elementit.
  28. Suorita yllä olevat toiminnot kutsumalla createStack-funktiota.
  29. Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
  30. Funktion main() rungon loppu.

emplace() ja swap()

Nämä ovat muita sisäänrakennettuja pinotoimintoja:

  • aseta()– luo uuden elementin pinon päällimmäiseksi.
  • vaihtaa()– vaihtaa pinon sisällön toisen pinon sisällön kanssa.

Esimerkki 3:

#include <iostream>    
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st1;
	stack<int> st2;

	st1.emplace(12);
	st1.emplace(19);

	st2.emplace(20);
	st2.emplace(23);

	st1.swap(st2);

	cout << "st1 = ";
	while (!st1.empty()) {
		cout << st1.top() << " ";
		st1.pop();
	}

	cout << endl << "st2 = ";
	while (!st2.empty()) {
		cout << st2.top() << " ";
		st2.pop();
	}
}

lähtö:

emplace() ja swap()

Tässä on kuvakaappaus koodista:

emplace() ja swap()

Code Selitys:

  1. Sisällytä iostream-otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  2. Sisällytä pinon otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  3. Sisällytä cstdlib-otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  4. Sisällytä std-nimiavaruus koodiimme käyttääksesi sen luokkia kutsumatta sitä.
  5. Kutsu main()-funktiota. Ohjelmalogiikka lisätään tämän funktion runkoon.
  6. Määritä pino nimeltä st1 tallentaaksesi kokonaislukuarvot.
  7. Määritä pino nimeltä st2 tallentaaksesi kokonaislukuarvot.
  8. Käytä emplace()-funktiota lisätäksesi kokonaisluvun 12 pinoon nimeltä st1.
  9. Käytä emplace()-funktiota lisätäksesi kokonaisluvun 19 pinoon nimeltä st1.
  10. Käytä emplace()-funktiota lisätäksesi kokonaisluvun 20 pinoon nimeltä st2.
  11. Käytä emplace()-funktiota lisätäksesi kokonaisluvun 23 pinoon nimeltä st2.
  12. Käytä swap()-funktiota vaihtaaksesi kahden pinon, st1 ja st2, sisältöä. Pinon st1 sisältö tulee siirtää pinoon st2. Pinon st2 sisältö tulee siirtää pinoon st1.
  13. Tulosta tekstiä konsoliin.
  14. Käytä while-lausetta ja tyhjä()-funktiota tarkistaaksesi, onko pino st1 tyhjä.
  15. Tulosta pinon st1 sisältö konsoliin. ” ” lisää tilaa pinoelementtien väliin tulostettaessa niitä konsoliin.
  16. Suorita pop()-funktio pinossa st1 poistaaksesi ylimmän elementin.
  17. While-lauseen rungon loppu.
  18. Tulosta tekstiä konsoliin. Loppu on a C++ avainsana loppuriville. Se siirtää hiiren osoittimen seuraavalle riville tulostamisen aloittamiseksi sieltä.
  19. Käytä while-lausetta ja tyhjä()-funktiota tarkistaaksesi, onko pino st2 tyhjä.
  20. Tulosta pinon st2 sisältö konsoliin. ” ” lisää tilaa pinoelementtien väliin tulostettaessa niitä konsoliin.
  21. Suorita pop()-funktio pinossa st2 poistaaksesi ylimmän elementin.
  22. While-lauseen rungon loppu.
  23. Main()-funktion rungon loppu.

Pinoa STL:ssä

STL (Standard Template Library) sisältää malliluokkia, jotka tarjoavat yhteisiä C++ tietorakenteita. Siksi pino voidaan toteuttaa myös STL:ssä. Sisällytämme tämän kirjaston vain koodiimme ja käytämme sitä pinon määrittämiseen.

stack<T> st; 

Yllä oleva syntaksi ilmoittaa pinon st tietotyypin T elementeille.

Esimerkki 4:

#include <iostream>      
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st;
	st.push(12);
	st.push(19);
	st.push(20);
	cout << st.top();   
	cout << st.size();  
}

lähtö:

Pinoa STL:ssä

Tässä on kuvakaappaus koodista:

Pinoa STL:ssä

Code Selitys:

  1. Sisällytä iostream-otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  2. Sisällytä pinon otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  3. Sisällytä cstdlib-otsikkotiedosto koodiimme käyttääksesi sen toimintoja.
  4. Sisällytä std-nimiavaruus koodiimme käyttääksesi sen luokkia kutsumatta sitä.
  5. Kutsu main()-funktiota. Ohjelmalogiikka tulisi lisätä tämän funktion runkoon.
  6. Määritä pino st kokonaislukutietojen tallentamiseksi.
  7. Lisää elementti 12 pinoon.
  8. Lisää elementti 19 pinoon.
  9. Lisää elementti 20 pinoon.
  10. Tulosta elementti konsolin pinon yläosassa.
  11. Tulosta pinon koko konsoliin.
  12. Funktion main() rungon loppu.

UKK

Pino noudattaa viimeisintä sisään, ensin ulos -järjestystä, joten se poistaa uusimman elementin ensin. Jono noudattaa ensimmäisenä sisään, ensin ulos -järjestystä poistaen vanhimman elementin ensin. Jokainen sopii erilaisiin käsittelytarpeisiin.

Kyllä. std::stack hyväksyy minkä tahansa sekvenssisäiliön toisena mallineargumenttina, kuten std::stack Oletusarvoinen deque sopii useimpiin tapauksiin, kun taas vector voi parantaa muistin lokaaliutta, kun pino kasvaa ennustettavasti.

Sekä push- että pop-operaatiot toimivat vakioajassa O(1), koska pino koskettaa vain sen ylintä elementtiä. Pohjana oleva deque lisää alkioita siirtämättä olemassa olevia, joten suorituskyky pysyy ennustettavana pinon koosta riippumatta.

std::pino ei tarjoa iteraattoreita, joten aluepohjainen silmukka ei käänny. Jokaisen arvon lukemiseksi kopioi pino ja kutsu toistuvasti top():ia ja pop():ia kopioinnin yhteydessä tai valitse deque, kun läpikulku on tarpeen.

pop()-funktio palauttaa tyhjän arvon rakenteensa ansiosta, erottaen poiston käytöstä poikkeusten turvallisuuden takaamiseksi. Lukeminen ja poistaminen yhdessä vaiheessa voivat menettää tietoja, jos kopiointi aiheuttaa virheen, joten kutsut ensin top()-funktiota ja sitten pop()-funktiota.

Ei. std::pino ei tarjoa sisäänrakennettua synkronointia, joten useiden säikeiden samanaikaiset push- ja pop-kutsujen aiheuttavat datakilpailuja. Suojaa jaettu käyttöoikeus mutexilla tai muulla lukitusmekanismilla ennen kuin käytät yhtä pinoa säikeiden välillä.

Kyllä. Tekoälykoodausavustajat lukevat kommentin tai funktion nimen ja tuottavat std::stack-määrittelyjä, push- ja pop-silmukoita sekä läpikulkulogiikkaa. RevLuotujen rajatarkistusten, kuten tyhjien()-testien, tarkasteleminen ennen pop()-funktiota, on edelleen tärkeää turvallisten ohjelmien kannalta.

Kyllä. GitHub Copilot suorittaa push-, pop-, top- ja empty()-kutsuja kirjoittaessasi ja ehdottaa säilövaihtoehtoja. Se on 2026 C++ Koodiälykkyys lisää symbolitietoisuutta, joten usean tiedoston pinoehdotukset pysyvät yhdenmukaisina.

Tiivistä tämä viesti seuraavasti: