中缀计算器

时间:2013-12-20 04:04:46

标签: c stack infix-notation

我正在写一个程序(这是家庭作业)来使用堆栈在C中创建一个中缀计算器。我提出了以下逻辑:

  • 有两个堆栈:一个用于数字,一个用于运营商。
  • 将输入存储为char字符串,然后一次扫描一个char,将每个元素推入正确的堆栈。
  • 在遇到封闭的paren时忽略开放的parens:从numstack弹出两个数字,从opstack中弹出一个运算符,根据弹出的值计算,然后返回答案。

    示例:(1+(2*3))应该给出7

    但它不起作用。 我把垃圾当作输出。 这是我的输出:

    enter string to be evaluated (100 chars max): (1+1)
    
    string : (1+1)
    Length : 5
     reading : (
     reading : 1  pushing : 1
     reading : +  pushing : 43
     reading : 1  pushing : 1
     reading : )  popping : 1 popping : 1 popping : 431 + 302 = 303
     pushing : 303
    

    我不明白为什么。一些帮助会很棒。


    我的代码:

    #include<stdio.h>
    #include<conio.h> // i **have to** use turbo c.
    #define LEN 25
    
    void push(int *stack  , int* top ,int item){
        printf(" pushing : %d ", item);
        stack[*top] = item;
        (*top)++;
    }
    
    int pop(int *stack , int* top){
        int temp;
        (*top)--;
        temp = stack[*top];
        printf(" popping : %d",temp); // this causing a dilemma while popping character operators.
        return temp;
    }
    
    void calc(int* numstack , int* numtop, int* opstack , int* optop){
        int num1,num2,ans;
        char sign;
    
        num1 = pop(numstack,numtop);
        num1 = pop(numstack,numtop);
    
        switch(pop(opstack,optop)){
            case '+' : ans = num1 + num2; sign = '+' ; break;
            case '-' : ans = num1 - num2; sign = '-' ; break;
            case '*' : ans = num1 * num2; sign = '*' ; break;
            case '/' : ans = num1 / num2; sign = '/' ; break;
        }
        printf("%d %c %d = %d \n",num1,sign,num2,ans);
        push(numstack,numtop,ans);
        while(getchar()!='\n'){} // cleanup stdin from any junk
    }
    
    int main(void){
        int optop = 0 , numtop = 0, i=0 , numstack[50] , opstack[30];
        char str[102], c;
        clrscr();
    
        // read and trim input evaluatioon string
        printf("enter string to be evaluated (100 chars max): ");
        fgets(str , 100 , stdin);
        while(str[i]!='\n'){ i++; }
        str[i] = '\0';
        printf("\nstring : %s \nLength : %d",str,i);
    
        i = 0;
        // evaluate
        while( (c=str[i]) !='\0'){
        printf("\n reading : %c ",str[i]);
        if(c=='('){ i++; continue; } // ignore open parens
        else if(c=='+'||c=='-'||c=='*'||c=='/') push(opstack,&optop,c);
        else if(c>=48 && c <=57) push(numstack,&numtop,(c-48));
        else if(c==')') calc(numstack , &numtop, opstack , &optop);
        else printf("\n%c is invalid..\n",c);
        i++;
        }
        printf("\nanswer is : %g",pop(numstack,&numtop));
        getch(); // again , *must use* turbo c
        return 0;
    }
    
  • 1 个答案:

    答案 0 :(得分:3)

    这是你的问题:

    num1 = pop(numstack,numtop);
    num1 = pop(numstack,numtop);
    

    您分配给num1两次,第一次应该是num2

    您还需要将最终答案行更改为:

    printf("\nanswer is : %d\n",pop(numstack,&numtop));
    

    %g代表双打,%d代表整数。