Sunteți pe pagina 1din 4

Stiva

1.Obiective
 Familiarizarea cu structura de dată abstractă stivă;
 Implementarea TDA stivă prin moştenire TDA lista;
 Verificarea închiderii corecte a parantezelor.

2.Aspecte teoretice
Stiva este un caz o structură de date liniară în care intrările şi ieşirile se fac la un singur capăt al ei.
Structura de stivă presupune, conform definiţiei, o anumită disciplină de acces:
 totdeauna se adaugă un obiect "deasupra" ultimului depus;
 totdeauna se extrage ultimul obiect adăugat.
Se spune că accesul la o stiva este de tip LIFO (Last In - First Out).

Această structură de date cunoaşte mai multe implementări (vectori alocaţi static sau dinamic,
înlănţuire simplă). Toate implementările au în comun cunoaşterea în permanenţă a vârfului stivei.
Operaţiile de inserare şi respectiv extragere ale elementelor nu necesită parcurgerea stivei şi deci nu
depind de numărul de elemente.

Operaţiile cu stiva poartă următoarele denumiri consacrate:


 push – inserare în stivă
 pop – îndepărtarea elementului din vârful stivei
 top – afişarea elementului din vârful stivei
 toppop – operaţia top urmată de pop
Se prezintă în continuare evoluţia unei stive implementată prin înlănţuire pentru următoarea
succesiune de operaţii (push(7), push(2), push (9), pop(). Vârful stivei (începutul înlănţuirii) este
indicat chiar de pointerul s (spre primul element).

s este NULL – stiva este vidă

push (7)

s 7

push (2)

s 2 7

push (2)

s 9 2 7

pop ()

s 2 7

1
3.Fişiere puse la dispoziţie
Pentru realizarea aplicaţiei propuse la acest laborator se va porni de la următoarele fişiere:
 data.h – fişier header pentru implementarea tipului DATA;
 lista.h - fişier header pentru implementarea TDA lista;
 lista.c – fişier sursă C cu implementarea funcţiilor corespunzătoare TDA lista;
 stiva.h - fişier header pentru implementarea TDA stiva;
 stiva.c - fişier sursă C cu implementarea funcţiilor corespunzătoare TDA stivă pe baza
funcţiilor corespunzătoare TDA lista.

//--------------------------------------------------------
// F i s i e r u l s t i v a . h
// Elaborat: PSG, 01.04.03
//--------------------------------------------------------

#ifndef __STIVA_H_
#define __STIVA_H_
#include "lista.h"

typedef LISTA STIVA;

// initializare stiva
extern STIVA news();

// inserare element in stiva


extern STIVA push(STIVA,DATA);

// indepartare element din stiva


extern STIVA pop(STIVA);

// afisarea elementului din varful stivei


extern DATA top(STIVA);

// afisarea elementului din varful stivei si stergerea lui


extern STIVA toppop(STIVA ,DATA *);

// testare stiva vida


extern LOGIC is_empty(STIVA);

// testare stiva plina


extern LOGIC is_full(STIVA);

// conversie stiva la sir


extern char * toString(STIVA s, char *zona);

// eliberare spatiu alocat de stiva


extern void destroys(STIVA);

#endif;

2
//--------------------------------------------------------
// F i s i e r u l s t i v a . c
// Elaborat: PSG, 01.04.03
//--------------------------------------------------------
#include "stiva.h"
#include "lista.h"

STIVA news()
{
return (STIVA)newl();
}
//--------------------------------------------------------
STIVA push(STIVA s,DATA x)
{
return ins_in_fata((LISTA)s,x);
}
//---------------------------------------------------------
STIVA pop(STIVA s)
{
return (STIVA) sterge_prim((LISTA)s);
}
//---------------------------------------------------------
DATA top(STIVA s)
{
return is_empty(s)?ABSENT : primul(LISTA)s);

}
//---------------------------------------------------------
STIVA toppop(STIVA s, DATA *val)
{
*val=top(s);
return pop(s);
}
//---------------------------------------------------------
LOGIC is_empty( STIVA s)
{
return este_vida((LISTA)s);
}
//---------------------------------------------------------
LOGIC is_full(STIVA s)
{
return este_plina((LISTA)s);
}
// ---------------------------------------------------------
char * toString(STIVA s, char *zona)
{
// completati cu codul necesar conversiei stivei s la sir
}

3
4.Aplicaţia propusă
Exerciţiul 1
Să se realizeze o aplicaţie tip meniu care să permită testarea operaţiilor cu stive. Stiva va conţine
elemente de tip caracter:
p – push (se va citi un caracter de la tast. si se va introduce in stiva)
q – pop
t – top
u - toppop
s – stare stiva (plina, vida, contine elemente)
a – afisare stiva (cu functia conv_stiva_sir)
v – verificare inchidere corecta a parantezelor (se citeste un sir continand
paranteze)
i – info autor
g – gata program

Exerciţiul 2
În aplicaţia anterioară, la cazul v se presupune că şirul conţine numai paranteze rotunde. Problema
validării închiderii corecte a parantezelor poate fi generalizată în sensul urmăririi unor perechi de
simboluri definite anterior.
Secvenţa se consideră validă dacă:
 fiecare pereche conţine un simbol de tipul stânga şi un simbol de tipul dreapta;
 fiecare simbol face parte din exact o pereche;
 secvenţa de simboluri care apare între simbol_stanga şi simbolul_dreapta trebuie să
satisfacă cele două condiţii anterioare.
Fiecare simbol ocupă exact un caracter.
De exemplu, fiind date perechile: ( - ), [ - ], { - }, S – D, următoarea secvenţă este validă:

(S[{SD()[]}]D)

În cazul unei expresii incorecte să se genereze un mesaj de eroare cât mai explicit.

S-ar putea să vă placă și