Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 波兰后缀符号不计算,始终显示';0';结果_C_Stack_Postfix Notation - Fatal编程技术网

C 波兰后缀符号不计算,始终显示';0';结果

C 波兰后缀符号不计算,始终显示';0';结果,c,stack,postfix-notation,C,Stack,Postfix Notation,我正在研究一个基于堆栈的波兰符号计算器,它读取中缀表达式,验证括号是否正确,将其转换为后缀,然后计算最终结果。但我在求值部分遇到了一些问题,代码跳过了整个“while”循环(我向其中添加了一些printf,以确定它停止工作的确切位置),并且始终将最终结果显示为“0” 这是我的数据结构研究。一切似乎都很好,但评估部分。我尝试过添加一些变量,但没有成功 void postfix(){ int i = 0, op1, op2; char ch; int p =-1; c

我正在研究一个基于堆栈的波兰符号计算器,它读取中缀表达式,验证括号是否正确,将其转换为后缀,然后计算最终结果。但我在求值部分遇到了一些问题,代码跳过了整个“while”循环(我向其中添加了一些printf,以确定它停止工作的确切位置),并且始终将最终结果显示为“0”

这是我的数据结构研究。一切似乎都很好,但评估部分。我尝试过添加一些变量,但没有成功

void postfix(){
    int i = 0, op1, op2;
    char ch;
    int p =-1;
    char exp[20];
    char *e, x;
    e = exp;

    printf("Input the expression again: ");
    scanf("%s", &exp);
    printf("\nThe postfix expression is: ");

    while(*e != 0){
        if(isalnum(*e)){
            printf("%c",*e);
            post[++p]=*e;
        } else if(*e == '(')
            push(*e);
        else if(*e == ')'){
            while((x = pop()) != '('){
                printf("%c", x);
                post[++p]=x;
            }
        } else{
            while(priority(pilha[top]) >= priority(*e)){
                char a;
                a= pop();
                printf("%c",a);
                post[++p]=a;
            }
            push(*e);
        }
        e++;
     }

    while(top != -1){
        char avaliada;
        avaliada = pop();

        printf("%c",avaliada);
        post[++p] = avaliada;
    }
}

void evaluation(){
    int i = 0, op1, op2;
    char ch;
    int p =-1;
    char exp[20];
    char *e, x;
    e = exp;

    postfix();

    while(i != (p+1)){
        ch=post[i];
        i++;

        if(isdigit(ch)){
            xpush(ch - '0');
        } else{
            op2=xpop();
            op1=xpop();

            switch(ch){
                case '+':xpush(op1+op2);break;
                case '-':xpush(op1-op2);break;
                case '*':xpush(op1*op2);break;
                case '/':xpush(op1/op2);break;
            }
        }

     printf("\n\nResult: %d\n",s[xtop]);
}

例如,如果我在控制台中输入“2-1”表达式,我希望它显示后缀符号,即“21-”,以及计算结果,即“1”,但实际输出为“0”。

与您的问题无关,但对于
scanf
格式说明符
%s
需要指向第一个字符或数组的指针,类型为
char*
。在您的情况下,这将是
&exp[0]
(这就是普通
exp
本身衰减的结果)。表达式
&exp
是指向数组本身的指针,其类型为
char(*)[20]
,在语义上与预期的非常不同。至于您的问题,现在似乎是一个非常好的时机。还有一个一般提示:停止使用全局变量!如果需要多个函数来访问某个对象,请将其作为参数传递。如果你想让一个函数返回一些东西,让它实际返回它。最后,请阅读,以及。请学习如何创建一个来向我们展示。哦,还有一个关于问题可能原因的最后提示:您有多少名为
p
的变量?它们是如何关联的(如果有关联的话)?与您的问题无关,但对于
scanf
格式说明符
“%s”
需要指向第一个字符或类型为
char*
的数组的指针。在您的情况下,这将是
&exp[0]
(这就是普通
exp
本身衰减的结果)。表达式
&exp
是指向数组本身的指针,其类型为
char(*)[20]
,在语义上与预期的非常不同。至于您的问题,现在似乎是一个非常好的时机。还有一个一般提示:停止使用全局变量!如果需要多个函数来访问某个对象,请将其作为参数传递。如果你想让一个函数返回一些东西,让它实际返回它。最后,请阅读,以及。请学习如何创建一个来向我们展示。哦,还有一个关于问题可能原因的最后提示:您有多少名为
p
的变量?它们是如何关联的(如果有关联的话)?