C 中缀计算器

C 中缀计算器,c,stack,infix-notation,C,Stack,Infix Notation,我正在写一个程序(这是家庭作业),用C语言用堆栈创建中缀计算器。我想出了以下逻辑: 有两个堆栈:一个用于数字,一个用于运算符。 将输入存储为字符字符串,然后一次扫描一个字符,将每个元素推入其适当的堆栈中。 忽略打开的参数,在遇到关闭的参数时:从numstack中弹出两个数字,从opstack中弹出一个运算符,根据弹出的值进行计算,然后返回答案 示例:(1+(2*3))应给出7 但它不起作用。 我得到垃圾作为输出。 这是我的输出: enter string to be evaluated (100

我正在写一个程序(这是家庭作业),用C语言用堆栈创建中缀计算器。我想出了以下逻辑:
  • 有两个堆栈:一个用于数字,一个用于运算符。
  • 将输入存储为字符字符串,然后一次扫描一个字符,将每个元素推入其适当的堆栈中。
  • 忽略打开的参数,在遇到关闭的参数时:从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;
    }
    
    #包括
    #包括//我**必须**使用turbo c。
    #定义LEN 25
    无效推送(int*堆栈、int*顶部、int项){
    printf(“推送:%d”,项目);
    堆栈[*顶部]=项目;
    (*顶部)++;
    }
    int-pop(int*stack,int*top){
    内部温度;
    (*顶部)--;
    温度=堆栈[*顶部];
    printf(“弹出:%d”,temp);//这导致在弹出字符运算符时出现进退两难的情况。
    返回温度;
    }
    无效计算(int*numstack,int*numtop,int*optstack,int*optop){
    int num1,num2,ans;
    字符符号;
    num1=pop(numstack,numtop);
    num1=pop(numstack,numtop);
    开关(pop(opstack,optop)){
    大小写“+”:ans=num1+num2;符号=“+”;中断;
    案例'-':ans=num1-num2;符号='-';中断;
    大小写“*”:ans=num1*num2;符号=“*”;中断;
    大小写“/”:ans=num1/num2;符号=“/”;中断;
    }
    printf(“%d%c%d=%d\n”,num1,符号,num2,ans);
    推送(numstack、numtop、ans);
    而(getchar()!='\n'){}//则从任何垃圾中清除stdin
    }
    内部主(空){
    int optop=0,numtop=0,i=0,numstack[50],opstack[30];
    char-str[102],c;
    clrsc();
    //读取并修剪字符串上的输入求值
    printf(“输入要计算的字符串(最多100个字符):”;
    fgets(str,100,stdin);
    while(str[i]!='\n'){i++;}
    str[i]='\0';
    printf(“\n字符串:%s\n长度:%d”,str,i);
    i=0;
    //评估
    而((c=str[i])!='\0'){
    printf(“\n读取:%c”,str[i]);
    如果(c=='('){i++;continue;}//忽略打开的参数
    else如果(c='+'| | c='-'| | c='*'| | c=='/')推送(opstack,&optop,c);
    否则,如果(c>=48&&c这是您的问题:

    num1 = pop(numstack,numtop);
    num1 = pop(numstack,numtop);
    
    您两次都分配给
    num1
    ,第一次应该是
    num2

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

    printf("\nanswer is : %d\n",pop(numstack,&numtop));
    
    %g
    代表双打,
    %d
    代表整数。

    这是您的问题:

    num1 = pop(numstack,numtop);
    num1 = pop(numstack,numtop);
    
    您两次都分配给
    num1
    ,第一次应该是
    num2

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

    printf("\nanswer is : %d\n",pop(numstack,&numtop));
    
    %g
    代表双打,
    %d
    代表整数。

    这是您的问题:

    num1 = pop(numstack,numtop);
    num1 = pop(numstack,numtop);
    
    您两次都分配给
    num1
    ,第一次应该是
    num2

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

    printf("\nanswer is : %d\n",pop(numstack,&numtop));
    
    %g
    代表双打,
    %d
    代表整数。

    这是您的问题:

    num1 = pop(numstack,numtop);
    num1 = pop(numstack,numtop);
    
    您两次都分配给
    num1
    ,第一次应该是
    num2

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

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


    %g
    表示双精度,
    %d
    表示整数。

    对不起。在我需要之前按下了post按钮。更新了查询。查找反向波兰符号-请参阅。有算法可以从中缀符号、硬编码
    48
    57
    转换为它。请在我尝试编译时使用
    c>=“0”和&c<'9'
    查看我得到的代码:calc.c:58:警告:格式“%g”要求类型为“double”,但参数2的类型为“int”,忽略打开的参数显然是错误的,因为
    1*(2+3)
    (1*2+3)
    将以相同的方式进行解析。关于如何使用运算符堆栈和操作数堆栈解析表达式,有大量文献……您应该研究一下。请注意,您的示例
    (1+(2*3))
    根本不需要parens,这是一个非常糟糕的例子。抱歉..在我需要之前按下了post按钮。更新了查询。查找反向波兰符号-请参阅。有算法可以从中缀符号转换为它。
    48
    57
    。请使用
    c>='0'&&c<'9'
    。当我尝试编译时ng我得到的代码:calc.c:58:警告:格式“%g”要求类型为“double”,但参数2的类型为“int”,忽略打开的参数显然是错误的,因为
    1*(2+3)
    (1*2+3)
    将以相同的方式进行解析。关于如何使用运算符堆栈和操作数堆栈解析表达式,有大量文献……您应该研究一下。请注意,您的示例
    (1+(2*3))
    根本不需要parens,这是一个非常糟糕的例子。抱歉..在我需要之前按下了post按钮。更新了查询。查找反向波兰符号-请参阅。有算法可以从中缀符号转换为它。
    48
    57
    。请使用
    c>='0'&&c<'9'
    。当我尝试编译时ng我得到的代码:calc.c:58:警告:格式“%g”要求类型为“double”,但参数2的类型为“int”,忽略打开的参数显然是错误的,因为
    1*(2+3)
    (1*2+3)
    将以相同的方式进行解析。关于如何使用运算符堆栈和操作数堆栈解析表达式,有大量文献……您应该研究一下。请注意,您的示例
    (1+(2*3))
    根本不需要parens,这是一个非常糟糕的例子。抱歉..在我需要之前按下了post按钮。更新了查询。查找反向波兰符号-请参阅。有算法可以从中缀符号转换为它。
    48
    57
    。请使用
    c>='0'&&c<'9'
    。当我尝试编译时ng我得到的代码:calc.c:58:警告:格式“%g”要求类型为“double”,但参数2的类型为“int”,忽略打开的参数显然是错误的,因为
    1*(2