Stack di complessi[C]

fk16
Ragazzi volevo solo sapere se queste funzioni per uno stack di complessi sono corrette....Grzie a tutti
typedef struct Complessi{
        double re;
        double im;
        }COMPLEX;

typedef struct {
	COMPLEX *s;
	int sindex, index;
} Stack;

Stack stack;

COMPLEX pop() {
	if (stack.sindex > 0)
		return stack.s[--stack.sindex];
	else {
		fprintf(stderr, "stack underflow!\n");
		return ;
	}
}

COMPLEX peek() {
    if (stack.sindex > 0)
		return stack.s[stack.sindex - 1];
	else {
		fprintf(stderr, "stack underflow!\n");
		return ;
	}
}

void push(COMPLEX val) {
	if (stack.sindex < stack.index) {
		stack.s[stack.sindex] = val;
		stack.sindex++;
	} else
		fprintf(stderr, "stack overflow!\n");
}

void init(int size) {
	stack.index = size;
	stack.s = (COMPLEX *) calloc(size, sizeof(COMPLEX));
	stack.sindex = 0;
}


void print() {
  printf("%lf\n", peek());
}

void dup() {
	push(peek());
}

void swap() {
	COMPLEX a,b;
	a = pop();
	b = pop();
	push(a);
	push(b);
}

Risposte
hamming_burst
"fk16":
Ragazzi volevo solo sapere se queste funzioni per uno stack di complessi sono corrette....Grzie a tutti

corrette nel senso:
- sulle proprietà dei numeri complessi
- nelle proprietà della struttura dati "stack"

claudio862
"hamming_burst":

- sulle proprietà dei numeri complessi

Beh non hai definito nessuna operazione sui complessi, c'è poco da verificare.

- nelle proprietà della struttura dati "stack"

Più o meno va bene. L'unico errore è che quando ottieni uno stack over/underflow non puoi semplicemente usare 'return;' poiché la funzione deve restituire una variabile di tipo COMPLEX. Potresti restituire il valore di COMPLEX corrispondente a (0,0), o un qualsiasi altro valore di riferimento.

Poi ci sono altre imprecisioni / possibili miglioramenti:
Hai definito una funzione 'init' che alloca memoria, ma non la liberi da nessuna parte. Ti serve una funzione 'destroy' o simile dove chiami free().

Come è implementato adesso nel tuo programma può esistere un unico stack di complessi, dato che tutte le funzioni usano la variabile globale 'stack'. Potresti passare ad ogni funzione la variabile Stack su cui operare (o meglio un puntatore a tale variabile). Qualcosa del genere:
COMPLEX pop(Stack * stack) {
   if (stack->sindex > 0)
      return stack->s[--stack->sindex];
   else {
      fprintf(stderr, "stack underflow!\n");
      COMPLEX zero;
      zero.re = 0.0; zero.im = 0.0;
      return zero;
   }
}

Infine sarebbe meglio chiamare il campo 'index' come 'size', dato che è una dimensione e non un indice.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.