Documente Academic
Documente Profesional
Documente Cultură
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;
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:
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.
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
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.
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ă).
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;
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.
| 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.).