这个中缀到postfix转换c ++代码有什么问题

时间:2013-11-10 16:15:26

标签: c++

我有这个程序用于中缀到后缀表达式转换,但它无法正常工作....例如。如果我输入表达式a+b+(c-d)*e,它会将输出后缀表达式设为abcd-++e*而不是abcd-e*++

char inputexp[50], stacks[50], resultexp[50];  
int stacktop=-1, resulttop=-1;

void priority()
{
    '^'>'/'>'*'>'+'>'-';
}

void push(char a)    
{
    stacktop++;  
    stacks[stacktop]=a;
}

void pop()
{
    resulttop++;  
    resultexp[resulttop]=stacks[stacktop];
    --stacktop;
}

void input()     
{   
    cout<<"Enter the infix expression=";  
    scanf("%s", inputexp);
}

void operandadd (char a)
{
    resulttop++;
    resultexp[resulttop]=a; 
}

void operatorfound (char a)    
{
    if(stacktop==-1||stacks[stacktop]=='(')
    {
        push(a);
    }
    else
    {         
        if(a<stacks[stacktop])        
        {              
            while(stacks[stacktop]>a&&stacks[stacktop]!='(')               
            {       
                pop();             
            }       
            push(a);        
        }    
        else         
        {            
            push(a);        
        }       
    }   
}

void rightparenthesisfound (char a)    
{        
    while(stacks[stacktop]!='(')        
    {           
        pop();       
    }       
    --stacktop;    
}

void leftparenthesisfound (char a)   
{        
    push(a);   
}

void variablefound(char a)   
{      
    resulttop++;     
    resultexp[resulttop]=a;   
}

void result()   
{      
    cout<<"Postfix Expression:"<<endl;

    for(int i=0; i<strlen(resultexp); i++)       
    {            
        cout<<resultexp[i]<<endl;        
    }    
}

int main()    
{       
    input();        
    cout<<strlen(inputexp)<<endl;
    priority();

    for(int i=0; i<strlen(inputexp); i++)         
    {            
        if(inputexp[i]=='+'||inputexp[i]=='-'||inputexp[i]=='*'||inputexp[i]=='/'||inputexp[i]=='^')             
        {                 
            operatorfound(inputexp[i]);                 
            cout<<stacks<<endl;    
        }             
        else if(inputexp[i]=='(')
        {                 
           leftparenthesisfound(inputexp[i]);            
        }             
        else if(inputexp[i]==')')        
        {
           cout<<"RIGHT "<<"STACK:"<<stacks<<endl;    
           rightparenthesisfound(inputexp[i]);                
           cout<<"RIGHT PARENTHESIS FOUND:"<<" Stack: "<<stacks<<"\t"<<"Result:"<<resultexp;    
        }            
        else             
        {                 
            variablefound(inputexp[i]);                 
            cout<<"RESULT: "<<resultexp<<endl;             
        }         
    }

    if(stacktop!=-1)         
    {             
        while(stacktop!=-1)            
        {                
           pop();                
        }        
    }

    cout<<endl<<resultexp<<endl;       
    return 0;
}

1 个答案:

答案 0 :(得分:0)

此功能不起作用:

void priority()
{
    '^'>'/'>'*'>'+'>'-';
}

从技术上讲,它将一个角色与另一个角色进行比较。结果永远不会返回。它看起来更像是混淆代码

优先级可以通过多种方式实现,常见的方法是通过代码中的if语句顺序。第一个if比较是最高优先级,下一个else if是下一个较低优先级,依此类推。

另一种方法是使用关联。该关联包含与符号关联的优先级编号:

{'^', 1}
{'/', 2}
{'*', 3}
{'+', 4}
{'-', 5}

这可以通过查找表或硬编码为switch语句来实现。

顺便说一下,您可能希望使用优先级而不是priority

此外,你应该让你的函数返回某些东西,否则外面的世界就不会知道它在做什么。

非常重要:在网上搜索“infix to postfix conversion c ++”,它会返回许多示例供您考虑。