Matriisin sijaan voimme käyttää myös linkitettyä listaa pinon toteuttamiseen. Linkitetty luettelo varaa muistin dynaamisesti. Kuitenkin aika monimutkaisuus molemmissa skenaarioissa on sama kaikille toiminnoille eli push, pop ja peek.
puu- ja graafiteoria
Pinon linkitetyssä listatoteutuksessa solmut säilyvät ei-vierekkäin muistissa. Jokainen solmu sisältää osoittimen sen välittömään seuraajasolmuun pinossa. Pinon sanotaan olevan ylivuoteltu, jos muistikasaan jätetty tila ei riitä solmun luomiseen.
Pinon ylimmän solmun osoitekentässä on aina nolla. Keskustellaan tavasta, jolla jokainen toiminto suoritetaan pinon linkitetyssä listatoteutuksessa.
Solmun lisääminen pinoon (push-toiminto)
Solmun lisäämistä pinoon kutsutaan nimellä työntää operaatio. Elementin työntäminen pinoon linkitetyssä luettelossa on eri asia kuin taulukkototeutuksessa. Elementin työntämiseksi pinoon tarvitaan seuraavat vaiheet.
- Luo ensin solmu ja varaa sille muisti.
- Jos lista on tyhjä, kohde tulee työntää listan aloitussolmuksi. Tämä sisältää arvon määrittämisen solmun dataosalle ja nolla-arvon määrittämisen solmun osoiteosalle.
- Jos listassa on jo solmuja, meidän on lisättävä uusi elementti listan alkuun (jotta ei rikota pinon ominaisuuksia). Tätä tarkoitusta varten määritä uuden solmun osoitekenttään aloituselementin osoite ja tee uusi solmu listan aloitussolmuksi.
- Kopioi pääosoitin väliaikaiseksi osoittimeksi.
- Siirrä väliaikainen osoitin luettelon kaikkien solmujen läpi ja tulosta jokaiseen solmuun liitetty arvokenttä.
Aika monimutkaisuus: o(1)
C toteutus:
void push () { int val; struct node *ptr =(struct node*)malloc(sizeof(struct node)); if(ptr == NULL) { printf('not able to push the element'); } else { printf('Enter the value'); scanf('%d',&val); if(head==NULL) { ptr->val = val; ptr -> next = NULL; head=ptr; } else { ptr->val = val; ptr->next = head; head=ptr; } printf('Item pushed'); } }
Solmun poistaminen pinosta (POP-toiminto)
Solmun poistamista pinon yläosasta kutsutaan nimellä pop operaatio. Solmun poistaminen pinon linkitetystä listasta on erilaista kuin taulukkototeutuksessa. Elementin nostamiseksi pinosta meidän on noudatettava seuraavia vaiheita:
kuinka poistaa ensimmäinen merkki excelissä
Aika monimutkaisuus: o(n)
C-toteutus
void pop() { int item; struct node *ptr; if (head == NULL) { printf('Underflow'); } else { item = head->val; ptr = head; head = head->next; free(ptr); printf('Item popped'); } }
Näytä solmut (kulkeminen)
Pinon kaikkien solmujen näyttäminen edellyttää pinon muodossa järjestetyn linkitetyn luettelon kaikkien solmujen läpikulkua. Tätä tarkoitusta varten meidän on noudatettava seuraavia vaiheita.
Aika monimutkaisuus: o(n)
C Toteutus
void display() { int i; struct node *ptr; ptr=head; if(ptr == NULL) { printf('Stack is empty '); } else { printf('Printing Stack elements '); while(ptr!=NULL) { printf('%d ',ptr->val); ptr = ptr->next; } } }
Valikkoohjattu ohjelma C:ssä, joka toteuttaa kaikki pinotoiminnot linkitetyn listan avulla:
#include #include void push(); void pop(); void display(); struct node { int val; struct node *next; }; struct node *head; void main () { int choice=0; printf(' *********Stack operations using linked list********* '); printf(' ---------------------------------------------- '); while(choice != 4) { printf(' Chose one from the below options... '); printf(' 1.Push 2.Pop 3.Show 4.Exit'); printf(' Enter your choice '); scanf('%d',&choice); switch(choice) { case 1: { push(); break; } case 2: { pop(); break; } case 3: { display(); break; } case 4: { printf('Exiting....'); break; } default: { printf('Please Enter valid choice '); } }; } } void push () { int val; struct node *ptr = (struct node*)malloc(sizeof(struct node)); if(ptr == NULL) { printf('not able to push the element'); } else { printf('Enter the value'); scanf('%d',&val); if(head==NULL) { ptr->val = val; ptr -> next = NULL; head=ptr; } else { ptr->val = val; ptr->next = head; head=ptr; } printf('Item pushed'); } } void pop() { int item; struct node *ptr; if (head == NULL) { printf('Underflow'); } else { item = head->val; ptr = head; head = head->next; free(ptr); printf('Item popped'); } } void display() { int i; struct node *ptr; ptr=head; if(ptr == NULL) { printf('Stack is empty '); } else { printf('Printing Stack elements '); while(ptr!=NULL) { printf('%d ',ptr->val); ptr = ptr->next; } } }