繁体   English   中英

使用堆栈的后缀转换器中缀

[英]infix to postfix converter using stack

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

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

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

更新:

好吧,我让它工作了,但是我很难弄清楚如果您输入像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。

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

从输入中提取值时,将其推入值堆栈中,如果发现运算符,则将其推入运算符堆栈中。

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

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

您还可以做一个递归下降解析器,尽管它实际上并不使用显式堆栈,但它使用隐式堆栈,因为隐式堆栈是递归调用的函数,因此该堆栈实际上是函数调用堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM