Kalkulator ONP (odwrotna notacja polska)

0

Siemka, mam pewien problem. Otóż napisałem kalkulator liczący wartość wyrażenia zapisanego w postaci ONP. Analizując kod, wszystko wydaje mi się w porządku, ale prosiłbym was o zerknięcie fachowym okiem. Otóż program za każdym razem zwraca wartość 13.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>

struct stack_node
{
    int data;
    struct stack_node * next;
};

struct stack_node * push (struct stack_node *top , int data){
    struct stack_node * new_node = (struct stack_node *)malloc(sizeof(struct stack_node));
    if(NULL!=new_node){
        new_node->data=data;
        new_node->next=top;
        top=new_node;
    }
    return top ;
}

int pop( struct stack_node ** top){
    int result=-1;
    if ( NULL != *top){
        result=(*top)->data;
        struct stack_node *tmp=(* top)->next;
        free(*top );
        *top=tmp;
    }
    return result ;
}

int peek(struct stack_node *top){
    if(NULL!=top)
    return top->data ;
    fprintf(stderr, " Stack is empty .\n") ;
    return top;
}

int umiesc(char a){
    struct stack *top = NULL;
    int wynik=0;
    if(a!='+' && a!='-' && a!='*' && a!='/'){
        a=a-'0';
        top=push(top, a);
    }
    else{
        switch(a){
        case'+':
            wynik=pop(&top)+pop(&top);
            top = push(top,wynik);
        case'-':
            wynik=pop(&top)-pop(&top);
            top = push(top,wynik);
        case'*':
            wynik=pop(&top)*pop(&top);
            top = push(top,wynik);
        case'/':
            wynik=pop(&top)/pop(&top);
            top = push(top,wynik);
        }
    }
    return pop(&top);
}
int main (){
    setlocale(LC_CTYPE, "Polish");
    struct stack *top = NULL;
    printf("Wprowadź liczby lub znaki żeby obliczyć wartość wyrażenia zapisanego w ONP: \n");
    char a;
    while(a!='='){
        scanf("%c", &a);
        umiesc(a);
    }

    printf("Wynik działania to: %d", umiesc(a));
    return 0;
}
2

Podpowiedź: '=' - '0' == 13

Swoją drogą, w każdym wywołaniu umiesc() tworzysz nową listę (ahem, "stack"), zamiast operować na przekazanej.

2

Jak wyżej, oraz, funkcja umiesc co ma robić? Przecież jest wołana w pętli od pojedynczego znaku, a wygląda jakby miałą ewaluować wyrażenie. A to a = a - '0'; czasem nie jest bug? Jak chcesz obliczać ONP, to czemu nie robić tego w funkcji wołanej od stringa, szkic:

int eval_onp(char expr[], int sz)
{
   int left = 0, right = 0, res = 0; 
   struct  Stack * stack = createStack(sz);
   for (int i = 0; i < sz; ++i)
   {    
       if (isdigit((unsigned char) expr[i]))
       {
            push(stack, expr[i] - '0');
       }
       else
       {
           left = pop(stack);
           right = pop(stack);
           res = calculate(expr[i], left, right);
           push(stack, res);
       }
   }
   return  pop(stack);
}
printf("%d\n", eval_onp("23+24+*", 7)); // -> 30

Stos: https://www.geeksforgeeks.org/stack-data-structure-introduction-program/
calculate nie problem napisać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1