Sunteți pe pagina 1din 4

Aplicații cu Stive și Cozi – implementate static

I. STIVA

Din punct de vedere fizic, stiva reprezintă o importantă structură de memorare folosită pentru
implementarea la nivel hardware a concepte software fundamentale: apelul funcţiilor, recursivitate.
Definitoriu pentru stivă reprezintă modul de acces la elementele sale şi nu modul specific de
implementare. Din punct de vedere software stiva este o structură de date abstractă definită prin
regulile de inserare şi extragere a datelor în / din ea, ambele operaţii fiind efectuate la acelaşi
capăt. Principiul de memorare este de tip LIFO (last-in first-out), adică ultimul inserat va fi
primul extras din stivă, elementele extrase apărând practic în ordine inversă faţă de cum au fost
introduse. Elementele stivei nu pot fi modificate în mod direct. Valorile elementelor nu sunt
accesibile cu excepția celui din vârful stivei (top of the stack).

Pentru folosirea bibliotecii de șabloane standard trebuie inclus fișierul header stack.h. Stiva se
implementează ca un adaptor peste un container.
#include <stack.h>
using namespace std;

Declarația unei variabile de tip stivă se face în mod similar cu tablourile (vectorii).
stack <int> s1;

Operații aplicabile Descriere


(regăsite în STL ca funcții specifice adaptorului stack)
push(e) inserează elementul e în vârful stivei
top returnează elementul din vârful stivei
pop extrage un element din vârful stivei
empty verifică dacă stiva este vidă
size returnează numărul de elemente al stivei

I.1. Testarea principalelor operații cu stiva. Abordare cu și fără STL.

Cunoscând și aplicând cele de mai sus realizați un program care creează o stivă de numere întregi
din valorile citite dintr-un fișier. Să se afișeze conținutul acesteia (atât timp cât stiva nu este vidă).

Pentru varianta fără șabloane se folosește vectorul de numere întregi st și vârful stivei (TOS),
ambele declarate global: int st[10], TOS; Stiva se consideră plină dacă reține exact 10
elemente. Se vor implementa următoarele funcții având prototipurile:

void create(); - inițializează vârful stivei cu -1.


int isFull(); - returnează 1 (true) dacă stiva este plină (vârful
stivei==9, overflow), sau 0 altfel.
int isEmpty(); - returnează 1 (true) dacă stiva este vidă (vârful
stivei==-1), sau 0 altfel.
void push(int v); - dacă stiva nu este plină se incrementează vârful
stivei și se depune elementul specificat ca
parametru pe stivă, altfel se afișează mesajul
“stack overflow”.
Computer Science and Electrical Engineering Department
Adrian FLOREA
int pop(); - dacă stiva nu este vidă se preia elementul din vârful
stivei (TOS) și se actualizează corespunzător TOS,
altfel se afișează mesajul “stack underflow”.
int top(); - dacă stiva nu este vidă se preia elementul din vârful
stivei (TOS), altfel se afișează mesajul “stack
underflow”.

I.2. Sortare cu ajutorul a două stive (STL)

Se citește din fișier un șir de numere întregi pozitive, terminat cu -1. Să se sorteze acest șir prin
inserție directă, cu ajutorul a două stive. În prima stivă se rețin numerele ordonate (descrescător,
astfel încât la baza stivei se află cel mai mare). La citirea unui nou număr din fișier (fie acesta x) se
extrag din această stivă toate numerele mai mici decât cel citit, salvându-le în a doua stivă. Inserăm
numărul x în stiva ordonată și apoi reintroducem numerele salvate (temporar) din a doua stivă.

I.3. Folosirea stivei în verificarea unui șir dacă este palindrom (STL)

Un palindrom este un șir de caractere având aceeași semnificație dacă este citit de la oricare din
capete. Scrieți un program care afișează un mesaj corespunzător “ESTE / NU ESTE Palindrom!”
pentru un șir citit de la tastatură și care se bazează pe o stivă de caractere. Se introduc în stivă
caracterele șirului analizat și apoi se extrag unul câte unul (parcurgerea în ordine inversă a șirului).
Pentru ca șirul să fie palindrom, caracterele scoase trebuie să coincidă cu cele obținute prin
parcurgerea normală a șirului. Extindeți problema și verificați care dintre liniile unui fișier conțin
șiruri palindrom.

I.4. Conversia între baze de numerație (STL)

Pentru afișarea unui număr întreg n în altă bază B se poate folosi o stivă în care se pun resturile
parțiale ale împărțirii repetate a numărului cu B. Scrieți un program care citește un număr întreg
pozitiv și o bază 2≤B≤9 și afișează reprezentarea numărului în baza B. Definiți o funcție pentru
afișarea rezultatului astfel încât B să poată fi ales între 2 și 16. Scrieți o funcție recursivă pentru
afișarea unui număr întreg zecimal n în baza B.

EVALUAREA EXPRESIILOR

O altă aplicabilitate importantă a mecanismului stivei se regăseşte în evaluarea expresiilor


(aritmetice, simbolice, relaţionale) din cadrul analizei sintactice – componentă a compilatoarelor.
Pentru evaluarea unei expresii aritmetice compilatorul o aduce la o formă bazată pe forma poloneză
postfixată în care au fost desfiinţate parantezele rotunde. Ordinea de evaluare a expresiilor compuse
este determinată de:
 utilizarea parantezelor
 precedenţa operatorilor

Notaţia poloneză (sau postfixată) este un mod de scriere a expresiilor, în care ordinea
operatorilor şi a operanzilor este schimbată faţă de cea dintr-o expresie uzuală.
În notaţia uzuală (numită şi infix) o expresie are forma: operand operator operand
În notaţia postfixată (poloneză) expresia este scrisă sub forma: operand operand operator.

Computer Science and Electrical Engineering Department


Adrian FLOREA
De exemplu:
a + b devine în notaţie poloneză a b +
(a - b) * c devine a b - c *
a - b * (c + d) devine a b c d + * -

Avantajul notaţiei poloneze este acela că indică ordinea corectă a evaluării operaţiilor fără a
utiliza paranteze. Astfel, o expresie poloneză poate fi evaluată printr-o singură parcurgere a sa.
Pentru evaluarea unei expresii în notaţie poloneză se poate folosi o stivă de valori reale. Ori de
câte ori întâlnim în expresie un operand, valoarea lui este introdusă în stivă. Daca întâlnim un
operator atunci se extrag două valori din vârful stivei, care sunt, de fapt, cei doi operanzi, se aplică
operatorul asupra valorilor extrase şi rezultatul este depus în stivă. În momentul în care s-a
terminat parcurgerea expresiei, rezultatul final al expresiei este în vârful stivei (şi stiva conţine
doar această valoare).

I.5. Implementaţi într-un program C++ următoarea cerinţă: Se citeşte dintr-un fişier o
expresie aritmetică în care operanzii sunt simbolizaţi prin litere mici (de la „a” la „z”) iar
operatorii sunt „+”,„-”,„*”,„/” cu semnificaţia cunoscută. Se pot folosi şi parantezele rotunde: „(”
şi „)”.Expresia se încheie cu terminatorul ; (caracterul punct-virgulă). Programul trebuie să
verifice dacă expresia este corectă din punct de vedere sintactic (parantezele trebuie să se
închidă corect, să nu existe doi operatori sau operanzi unul după celălalt, expresia să nu se
încheie cu un operator). Se va ţine cont de următoarele indicaţii: o expresie (S) este alcătuită din
termeni (T), separaţi prin „+” sau „-”; un termen este alcătuit din factori (F) separaţi prin „*” sau
„/”; un factor este sau o literă mică sau o expresie cuprinsă între paranteze.

I.6. Implementaţi într-un program C++ următoarea problemă: Se citeşte dintr-un fişier o
expresie aritmetică în care operanzii sunt simbolizaţi prin litere mici (de la „a” la „z”) iar
operatorii sunt „+”,„-”,„*”,„/”,„(” şi „)” cu semnificaţia cunoscută. Expresia se încheie cu
terminatorul ; (caracterul punct-virgulă). Se cere să se convertească această expresie într-o
expresie în forma poloneză (postfixată).

I.7. Implementaţi într-un program C++ următoarea problemă: Dându-se o expresie în


forma poloneză (postfixată), realizaţi programul care calculează expresia utilizând numai
instrucţiuni de atribuire cu un singur operator. Se vor introduce variabilele auxiliare x 1, x2, …, xn,
unde n reprezintă numărul operaţiilor care apar în expresie. Să se verifice aplicaţia pentru diverse
expresii şi pentru diverse valori aferente fiecărui operand (simbol).

II. COADA
Definitoriu pentru coadă (queue) reprezintă modul de acces la elementele sale şi nu modul specific
de implementare. Din punct de vedere software coada este o structură de date abstractă definită
prin regulile de inserare şi extragere a datelor în / din ea. Inserarea se face “la coadă”, iar
eliminarea se efectuează la celălalt capăt (“din față”). Principiul de memorare este de tip FIFO
(first-in first-out), adică primul sosit va fi primul extras din coadă, elementele extrase apărând
practic în ordine directă (exact așa cum au fost introduse). Elementele cozii nu pot fi modificate în
mod direct. Valorile elementelor nu sunt accesibile cu excepția celui din vârful cozii (front of the
queue).
Pentru folosirea bibliotecii de șabloane standard trebuie inclus fișierul header queue.h. Coada se
implementează ca un adaptor peste un container.
#include < queue.h>
using namespace std;
Computer Science and Electrical Engineering Department
Adrian FLOREA
Declarația unei variabile de tip coadă se face în mod similar cu tablourile (vectorii).
queue <int> q1;

Operații aplicabile Descriere


(regăsite în STL ca funcții
specifice adaptorului queue)
push(e) inserează e ca fiind ultimul element în coadă
front returnează elementul din fruntea cozii (primul)
pop șterge primul element din coadă (pe cel la care pointează front)
empty verifică dacă coadă este vidă
size returnează numărul de elemente din coadă

II.1. Problema lui Josephus. Abordare cu STL.

Cunoscând și aplicând cele de mai sus realizați următorul program: Un grup de n copii se
așează în cerc, se numerotează în sens orar cu 1, 2,...,n și rostesc o formulă de selecție de tip “ala
bala portocala …”. Fiecăruia, începând cu primul, i se asociază un cuvânt din formulă de selecție.
Cel care primește ultimul cuvânt este eliminat din cerc. Jocul continuă, începând formula de selecție
de la următorul copil, până când se elimină toți copiii. Folosind numerotarea inițială, să se afișeze
ordinea ieșirii copiilor din joc.

II.2. Operații cu structuri de tip coadă (STL)

Scrieți un program care implementează următoarele funcții:


a) Creează o coadă, cu valori citite dintr-un fișier;
b) Afișează conținutul unei cozi, elementele fiind separate prin caracterul |, precum în
exemplul următor:

| 7 | 213 | -9 | 4 | 7 | -4 |

c) Având ca parametrii două cozi, C1 și C2, copiază coada C1 la sfârșitul lui C2;
d) Având ca parametru o coadă, verifică dacă această este ordonată;
e) Creează o nouă coadă care conține toate elementele din prima coadă care ocupau poziții
pare.

BIBLIOGRAFIE

[Ior05] Iorga V., Opincaru C., Stratan C., Chiriță A. – „Structuri de date și algoritmi. Aplicații
în C++ folosind STL”, Editura Polirom, 2005.
[Tud08] Tudor S. – „Informatica. Curs pentru clasele a IX-a și a X-a”, Editura L&S INFO-MAT,
2008.
[Flo07] Florea A. – Introducere in stiinta si ingineria calculatoarelor. Interfata Hardware -
Software, Editura MatrixROM, Bucuresti, 2007, ISBN 978-973-755-264-8, (313 pg.).

Computer Science and Electrical Engineering Department


Adrian FLOREA

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