Documente Academic
Documente Profesional
Documente Cultură
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.
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"
// initializare stiva
extern STIVA news();
#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.