0

我有这个程序用于中缀到后缀表达式的转换,但它不能正常工作......例如。如果我输入表达式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;
}
4

1 回答 1

0

这个函数不做任何事情:

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

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

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

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

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

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

顺便说一句,您可能想要术语优先级而不是priority.

另外,你应该让你的函数返回一些东西,否则外界将不知道它在做什么。

很重要:在网上搜索“infix to postfix conversion c++”,它会返回很多例子供你思考。

于 2013-11-10T17:05:56.843 回答