calculater by using reverse polish notation and using a stack

Posted by programmer on Stack Overflow See other posts from Stack Overflow or by programmer
Published on 2013-07-01T03:06:18Z Indexed on 2013/07/01 4:21 UTC
Read the original article Hit count: 791

Filed under:
|

hello everyone I have a segmentation fault ,can you help please? if i have this operater "3 5 +" that mean 3+5 and like "9 8 * 5 + 4 + sin", "sin(((9*8)+5)+4)" so my idea is check if the first and second are numbers and push theem in the stack then when i have operator i pop the numbers and make the calculation then push the answer again. `

typedef struct st_node {
    float val;
    struct st_node *next;
} t_node;

typedef t_node t_stack;


// a function to allocate memory for a stack and returns the stack
t_stack* fnewCell() {
    t_stack* ret;
    ret = (t_stack*) malloc(sizeof(t_stack));
    return ret;
}
// a function to allocate memory for a stack, fills it with value v and pointer n ,    and returns the stack
t_stack* fnewCellFilled(float v, t_stack* n) {
    t_stack* ret;
    ret = fnewCell();
    ret->val = v;
    ret->next =n;
    return ret;
}

//function to initialize stack
void initstack(t_stack** stack) {
    fnewCellFilled(0,NULL);
}

// add new cell
void insrtHead(t_stack** head,float val) {
    *head = fnewCellFilled(val,*head);
}

//function to push the value v into the stack s 
void push(t_stack **s, float val) {
    insrtHead(s,val);
}

//function to pop a value from the stack and returns it
int pop(t_stack **s) {
    t_stack* tmp;
    int ret;
    tmp = (*s)->next;
    ret = (*s)->val;
    free(*s);
    (*s) = tmp;
    return ret;
}

int isempty (t_stack *t) {
    return t == NULL;
}


//function to transfer a string(str) to int (value)
//returns -1 when success , i otherwise
int str2int(char *str,int *value) {
    int i;
    *value = 0;
    int sign=(str[0]=='-' ? -1 : 1);
    for(i=(str[0]=='-' ? 1 : 0);str[i]!=0;i++) {
        if(!(str[i]>=48 && str[i]<=57)) // Ascii char 0 to 9
            return i;
        *value= *value*10+(str[i]-48);
    }
    *value = *value * sign;
    return -1;
}

//a function that takes a string, transfer it into integer and make operation using a stack
void function(t_stack *stack, char *str)
{
    char x[10]=" ";
    int y,j,i=0,z;
    printf("++\n");
    if(str[i] != '\0') {
        strcpy(x, strtok(str, " "));
        z= str2int(x, &y);
        if(z == -1) 
        {
            push(&stack,y);
            i=i+2;
        }
    } 
    while(str[i] != '\0')
    {
        strcpy(x, strtok(NULL, " "));
        z= str2int(x, &y);
        if(z == -1) 
        {
            printf("yes %d",y);
            push(&stack,y);
            i=i+2;  
        }
        else 
        { 
            y=pop(&stack);
            j=pop(&stack);

            if(x[0] == '+' ) push(&stack,y+j);
                else if (x[0] == '-' ) push(&stack,j-y);
                else if(x[0] == '*' ) push(&stack,j*y);
                else if(x[0] == '/') push (&stack ,j/y);
        } 
    }
} 

int main() {
    t_stack *s;
    initstack(&s);
    char *str="3 5 +";    
    function(s,str);
    return 0;
}

`

© Stack Overflow or respective owner

Related posts about c

    Related posts about stack