ecco, ho terminato
ho evitato puntatori a puntatori di struttura ed ho usato solo puntatore a struttura
codice:
#include <stdio.h>
#include <stdlib.h>
#define n 4
/*
*
*/
struct stackNode{
int data;
struct stackNode *nextPtr;
};
typedef struct stackNode *Stack;
void push(Stack *topPtr, int dat);
int pop(Stack *topPtr);
int main() {
struct vettore{
char OP;
int NUM;
} V[n];
Stack stackPtr = NULL;
char o;
int nu,i;
float x,y;
float app;
for (i = 0; i < n; i++){
printf ("Inserire il carattere : \n");
printf ("'O' se operatore aritmetico\n");
printf ("'N' se operando\n");
printf ("'F' se forma polacca terminata\n");
fflush(stdin);
scanf ("%c", &o);
V[i].OP = o;
if (o != 'F'){
printf ("Inserire il numero : \n");
scanf ("%d", &nu);
V[i].NUM = nu;
}
else{
("Stringa finita\n");
}
}
for (i = 0; i < n; i++){
if (V[i].OP == 'N' )
{
push (&stackPtr, V[i].NUM);
}
if (V[i].OP == 'O'){
if(!isEmpty(&stackPtr)){
y = pop(&stackPtr);
x = pop(&stackPtr);
if (V[i].NUM == 1){
app = (float)(x + y);
push(&stackPtr, app);
}
if (V[i].NUM == 2){
app = (float)(x - y);
push(&stackPtr, app);
}
if (V[i].NUM == 3){
app = (float)(x * y);
push(&stackPtr, app);
}
if (V[i].NUM == 4){
app = (float)(x/y);
push(&stackPtr, app);
}
}
}
if (V[i].OP == 'F'){
printf ("Forma polacca terminata \n");
printf ("Risultato %.2f : ",app);
}
}
system("PAUSE");
return 0;
}
void push(Stack *topPtr, int dat)
{
Stack newPtr; /*puntatore al nuovo nodo*/
newPtr = malloc(sizeof(struct stackNode));
/*inserisce il nodo in cima alla pila*/
/*newPtr punta al nuovo nodo, in data mette il valore mentre in nextPtr mette il puntatore al top*/
if (newPtr != NULL){
newPtr->data = dat; /*assegna il nuovo dato al nuovo nodo */
newPtr->nextPtr = *topPtr; /*assegna il puntatore alla testa della pila*/
*topPtr = newPtr; /*ovviamente aggiorna il top della pila con il puntatore al nuovo nodo*/
}
else{
printf("%d non inserito \n", dat);
}
}
int pop(Stack *topPtr)
{
Stack tempPtr; /*puntatore a un nodo temporaneo */
int popValore;
/*Conserva il puntatore al top in tempPtr che servirà per rilasciare la locazione di memoria del nodo prelevato */
tempPtr = *topPtr;
/*Preleva il dato dal primo nodo (puntato da topPtr) e lo salva in popValore*/
popValore = (*topPtr)->data;
/*il puntatore del nodo prelevato diventa il topPtr*/
*topPtr = (*topPtr)->nextPtr;
/*libera la locazione di memoria del nodo da cui si è prelevato il dato*/
free(tempPtr);
return popValore;
}
int isEmpty(Stack topPtr)
{
return topPtr == NULL;
}
grazie per la pazienza