Setul 13

Problema 1 Scrieți o implementare pentru tipul de date abstract stivă folosind liste simplu înlănțuite. Asigurați-vă că programul invert.c funcționează tot așa cum funcționa cu implementarea bazată pe tablou. Nu aveți voie să modificați codul din stiva.h și din invert.c

/*********** * stiva.h * ***********/#ifndef STIVA_H#define STIVA_H /* Initializeaza stiva. Aloca resursele necesare pentru gestionarea stivei. */void init(void); /* Adauga un element in stiva. */void pune(double d); /* Extrage un element din stiva si returneaza valoarea lui. */double scoate(void); /* Returneaza elementul din varful stivei, fara a-l extrage din stiva. */double ia_varf(void); /* Returneaza 1 daca stiva e goala si 0 altfel. */int gol(void); /* Returneaza 1 daca stiva e plina si 0 altfel. */int plin(void); /* Extrage toate elementele din stiva si elibereaza orice resurse au fost folosite pentru memorarea elementelor. */void goleste(void); #endif

/************ * invert.c * ************/ #include <stdio.h>#include "stiva.h" int main(void){ int i; double element; init(); for (i = 0; i < 10; i++) { element = i; printf("punem %lf ... ", element); pune(element); printf("[PUS]\n"); } while (!gol()) { printf("urmeaza sa scoatem %lf ... ", ia_varf()); scoate(); printf("[SCOS]\n"); } goleste(); /* stiva deja e goala in acest punct, dar e important sa dam ocazia sa se elibereze resursele folosite de stiva. */ return 0;}

Start

#include <stdio.h>

#include <stdlib.h>

#include "stiva.h"

#define MAX 100

static double stiva[MAX];

static int varf;

void init(void)

{

int i;

for (i = 0; i < MAX; i++) {

stiva[i] = 0;

}

varf = -1;

}

int plin(void)

{

return (varf == MAX - 1);

}

int gol(void)

{

return (varf == -1);

}

void pune(double nr)

{

if (plin()) {

printf("Eroare: stiva este plina\n");

} else {

stiva[++varf] = nr;

}

}

double scoate(void)

{

if (gol()) {

printf("Eroare: stiva este goala\n");

return -1;

}

return stiva[varf--];

}

double ia_varf(void)

{

if (gol()) {

printf("Eroare: stiva este goala\n");

return -1;

}

return stiva[varf];

}

void goleste(void)

{

while (!gol()) {

scoate();

}

}

int main()

{

printf("Hello world!\n");

return 0;

}

Problema 2 (Evaluarea unei expresii în notație poloneză) Notația poloneză (sau postfix) 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 postfix (poloneză) expresia este scrisă sub forma: operand operand operator.

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 + * -

Scrieți un program care evaluează expresii postfix cu operanzi numere reale, expresii citite dintr-un fișier de intrare, câte una pe fiecare rând. Folosiți la implementare tipul de date abstract stiva definit mai sus. Pentru a testa programul puteți folosi fișierul

2 3 + 44.1 17.6 - -8 * 7 3.3 -9 -0.5 + * -

pentru care rezultatul trebuie să fie

5 -212 38.35

Rezolvare notatie prefix+tastatura:

#include <stdlib.h>

#include <stdio.h>

#include <ctype.h>

int getcsp(void) { scanf(" "); return getchar(); }

int expr(void)

{

int c, n;

switch (c = getcsp()) {

case '+': return expr() + expr();

case '-': n = expr(); return n - expr();

case '*': return expr() * expr();

case '/': n = expr(); return n / expr();

default: if(isdigit(c)) { ungetc(c, stdin); scanf("%d", &n); return n; }

else { fputs("trebuie numar sau operator", stderr); return -1; }

}

}

int main(void)

{

printf("%d\n", expr());

return 0;

}