0

我想将中缀转换为后缀表达式。这是我的代码:

问题是这实际上并没有这样做,我很困惑为什么。一切对我来说都很有意义,但是当我输入例如4*5作为输出时,我得到了同样的结果。中缀是一个输入,而后缀是我想要作为指向后缀的指针返回的内容,因此可以对其进行评估。

如果操作数是 * - + 或 /,则返回 true

更新:

oki 我得到了它的工作,但我很难弄清楚如果你输入像 5 * 3 + -1.2 那么如果你想要负数,它就行不通了。

void infix2postfix(char* infix, char* postfix){
     char *in,*post;
        Stack<char>Q;
        char n;
        in = &infix[0];
        post = &postfix[0];
        while(*in){
            while(*in == ' ' || *in == '\t'){
                in++;
            }
            if( isdigit(*in) || isalpha(*in) ){
                while( isdigit(*in) || isalpha(*in)){
                    *post = *in;
                    post++;
                    in++;
                }
            }
            if( *in == '(' ){
                Q.Push(*in);
                in++;
            }
            if( *in == ')'){
                n = Q.Pop();
                while( n != '(' ){
                    *post = n;
                    post++;
                    n = Q.Pop();
                }
                in++;
            }
            if( operand(*in) ){
                if(Q.IsEmpty())
                    Q.Push(*in);
                else{
                    n = Q.Pop();
                    while(priority(n) >= priority(*in)){
                        *post = n;
                        post++;
                        n = Q.Pop();
                    }
                    Q.Push(n);
                    Q.Push(*in);
                }
                in++;
            }
        }
        while(!Q.IsEmpty())
        {
            n = Q.Pop();
            *post = n;
            post++;

        }
        *post = '\0';
    }

这是我的代码新代码,它可以工作,但我希望它可以与一元运算符一起使用,所以它会接受输入4 * 5 + 4 + -1.2,所以之间有一个空格,如果没有,那么它是例如 -1.2 负数。我的代码也不适用于大于 9 的整数,如果我输入 10,那么它只会乘以 1*0。.

4

1 回答 1

0

如果可以使用两个堆栈,则可以将一个用于值,一个用于运算符。

当您从输入中提取一个值时,将其压入值堆栈,当您找到一个运算符时,将其压入运算符堆栈。

然后在创建输出时,从运算符堆栈中弹出一个运算符,从值堆栈中弹出一个或两个(取决于运算符)值。输出值,输出运算符。对于使用多个运算符的表达式,前一个操作被认为是第一个值,因此您下次只需弹出一个(或零)值。

当然,这是一种幼稚的方式,并且不处理诸如运算符优先级之类的事情。

你也可以做一个递归下降解析器,虽然它实际上不使用显式堆栈,但它使用隐式堆栈,因为函数被递归调用,所以堆栈实际上是函数调用堆栈。

于 2012-12-10T06:31:52.933 回答