Structuri de Date Liniare

Manual Interactiv: Stivă & Coadă

Stiva - Principiul LIFO

Ultimul element intrat este primul element care iese.

1. Operația de Adăugare (PUSH)

Index 0 Index 1 NOU (vf) VF

Ce se întâmplă pas cu pas:

  • Pasul 1: Verificăm dacă vectorul mai are spațiu liber (dacă vf nu a ajuns la maxim).
  • Pasul 2: Variabila vf (vârful) crește cu 1. Ea se mută pe următoarea poziție goală de sus.
  • Pasul 3: Pe noua poziție indicată de vf, scriem valoarea noului element.
void adauga(int &vf, int e)
{
    if (vf < MAX - 1)
    {
        vf = vf + 1;      // Creștem indicele (Pasul 2)
        stiva[vf] = e;    // Memorăm elementul (Pasul 3)
    }
    else
    {
        cout << "Stiva plina" << endl;
    }
}

2. Operația de Ștergere (POP)

Sters VF

Ce se întâmplă pas cu pas:

  • Pasul 1: Verificăm dacă stiva are elemente (adică vf != -1).
  • Pasul 2: (Opțional) Putem șterge valoarea din memorie punând 0.
  • Pasul 3: Decrementăm vf (scădem cu 1). Vârful coboară la elementul de dedesubt. Elementul de sus devine inaccesibil.
void sterge(int &vf)
{
    if (vf != -1)
    {
        stiva[vf] = 0;    // Curățăm locul (Pasul 2)
        vf = vf - 1;      // Coborâm vârful (Pasul 3)
    }
    else
    {
        cout << "Stiva vida" << endl;
    }
}

3. Simulator Stivă Complet

#include <iostream>
using namespace std;

#define MAX 100
int stiva[MAX];
int vf = -1;

void adauga(int &vf, int e)
{
    if (vf < MAX - 1)
    {
        vf++;
        stiva[vf] = e;
        cout << "Adaugat: " << e << endl;
    }
    else
    {
        cout << "Stiva plina!" << endl;
    }
}

void sterge(int &vf)
{
    if (vf != -1)
    {
        cout << "Sters: " << stiva[vf] << endl;
        stiva[vf] = 0;
        vf--;
    }
    else
    {
        cout << "Stiva vida!" << endl;
    }
}

void afiseaza(int vf)
{
    cout << "Stiva: ";
    for(int i=0; i<=vf; i++) cout << stiva[i] << " ";
    cout << endl;
}

int main()
{
    int opt, val;
    do
    {
        cout << "\n1.Push 2.Pop 3.Afiseaza 0.Exit: ";
        cin >> opt;
        if(opt==1) { cin>>val; adauga(vf,val); }
        else if(opt==2) sterge(vf);
        else if(opt==3) afiseaza(vf);
    } while(opt!=0);
    return 0;
}

Coada - Principiul FIFO

Primul venit este primul servit. Adăugăm la ULTIM, ștergem de la PRIM.

1. Operația de Adăugare (La sfârșit)

NOU ULTIM

Ce se întâmplă pas cu pas:

  • Pasul 1: Verificăm spațiul în vector.
  • Pasul 2: Variabila ultim crește cu 1. Ne mutăm "coada" rândului mai în spate.
  • Pasul 3: Pe poziția ultim punem noul element.
void adauga(int &ultim, int e)
{
    if (ultim < MAX - 1)
    {
        ultim = ultim + 1;   // Mutăm indicatorul de final (Pasul 2)
        coada[ultim] = e;    // Scriem elementul (Pasul 3)
    }
    else
    {
        cout << "Coada plina" << endl;
    }
}

2. Operația de Ștergere (De la început)

Gol Acum PRIM PRIM

Ce se întâmplă pas cu pas:

  • Pasul 1: Verificăm dacă există elemente între prim și ultim.
  • Pasul 2: Elementul de pe poziția prim este "servit" (șters logic).
  • Pasul 3: Variabila prim crește cu 1. Linia de start se mută spre dreapta.
void sterge(int &prim, int ultim)
{
    if (prim <= ultim)
    {
        coada[prim] = 0;     // Ștergem elementul (Pasul 2)
        prim = prim + 1;     // Avansăm linia de start (Pasul 3)
    }
    else
    {
        cout << "Coada vida" << endl;
    }
}

3. Simulator Coadă Complet

#include <iostream>
using namespace std;

#define MAX 100
int coada[MAX];
int prim = 0;
int ultim = -1;

void adauga(int &ultim, int e)
{
    if (ultim < MAX - 1)
    {
        ultim++;
        coada[ultim] = e;
        cout << "Adaugat: " << e << endl;
    }
    else
    {
        cout << "Coada plina!" << endl;
    }
}

void sterge(int &prim, int ultim)
{
    if (prim <= ultim)
    {
        cout << "Servit: " << coada[prim] << endl;
        coada[prim] = 0;
        prim++;
    }
    else
    {
        cout << "Coada vida!" << endl;
    }
}

void afiseaza(int prim, int ultim)
{
    if(prim > ultim) cout << "Coada goala";
    else {
        cout << "Coada: ";
        for(int i=prim; i<=ultim; i++) cout << coada[i] << " ";
    }
    cout << endl;
}

int main()
{
    int opt, val;
    do
    {
        cout << "\n1.Add 2.Del 3.Show 0.Exit: ";
        cin >> opt;
        if(opt==1) { cin>>val; adauga(ultim,val); }
        else if(opt==2) sterge(prim, ultim);
        else if(opt==3) afiseaza(prim, ultim);
    } while(opt!=0);
    return 0;
}