Рассчитать с помощью обратной польской записи и с использованием стека

Привет всем, у меня ошибка сегментации, вы можете помочь, пожалуйста? если у меня есть этот оператор "3 5 +", что означает 3+5 и как "9 8 * 5 + 4 + грех", "грех (((9*8)+5)+4)", так что моя идея проверить, если первые и вторые числа и помещают их в стек, затем, когда у меня есть оператор, я выскакиваю числа и делаю вычисления, затем нажимаю ответ снова. `

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;
}

`

1 ответ

Решение

Где я заметил:

1)

void initstack(t_stack** stack) {
    fnewCellFilled(0,NULL);
}

Наверное

void initstack(t_stack** stack) {
    *stack=fnewCellFilled(0,NULL);
}

2)

Строковый литерал заменен на strtok

char *str="3 5 +";

должно быть

char str[]="3 5 +";    

3)

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);
    } 

Наверное

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);
        i += 1;//need increment i
    } 
Другие вопросы по тегам