计算器通过使用反向抛光表示法和使用堆栈

时间:2013-07-01 03:06:19

标签: c stack

大家好我有分段错误,你能帮帮忙吗?  如果我有这个操作员“3 5 +”,意思是3 + 5 并且像“9 8 * 5 + 4 + sin”,“sin(((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 个答案:

答案 0 :(得分:0)

我注意到的地方:

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
    }