Stack di complessi[C]
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
"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"
"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.