3.21√ 将一个通常书写形式且书写正确的表达式转换为逆波兰式。

好多需要注意的点。。。改起来好烦。。。。。

#include <stdio.h>
#define maxsize 100

int compare_dominant(char a, char b)
{//比较运算符的优先级
    
    if(a == '+' || a == '-' && b == '/' || b == '*')
        return 0;
    if(a == '/' || a == '*' && b == '+' || b == '-')
        return 1;
    if(a == '+' || a == '-' && b == '+' || b == '-')
        return 0;
    if(a == '/' || a == '*' && b == '/' || b == '*')
        return 0;
}
    
void trans_post_exp(char exp[], char newexp[])
{//将中缀表达式(已存储在数组中)转换成后缀表达式,将后缀表达式存储在另一个数组中;

    int i=0;
    char stack[maxsize]; int top = -1;
    

    for(int k=0; exp[k] != '#'; k++)
    {   
        //扫描到左括号,则直接入栈
        if(exp[k] == '(')      
            stack[++top] = exp[k];
            
        //若扫描到右括号,则令栈顶元素出栈,并存入新数组中
        else if(exp[k] == ')' && top != -1)
        {
            newexp[i++] = stack[top--];
            if(stack[top] == '(')
                    top--;
        }
            
        //若扫描到字母,则直接存入新数组中;
        else if(exp[k] != '+' && exp[k] != '-' && exp[k] != '/' && exp[k] != '*')
            newexp[i++] = exp[k];
            
        //若扫描到运算符,则将其与栈顶运算符比较优先级,如果新运算符优先级较高,将其入栈,
        //否则栈顶元素出栈并入新数组,再将新运算符入栈
        else
        {
            if(top == -1 || stack[top] == '(')   //栈空或者栈顶元素为左括号时直接入栈
                stack[++top] = exp[k];
                
            else if(compare_dominant(exp[k], stack[top]) == 1)
                stack[++top] = exp[k];
                
            else        //新运算符优先级不高于栈顶元素时,一直出栈,直到新运算符优先级高于栈顶元素
            {
                while(compare_dominant(exp[k], stack[top]) == 0 && top != -1)
                    newexp[i++] = stack[top--];
                stack[++top] = exp[k];
            }
            
        }
    }

    while(top != -1 )
    {
        if(stack[top] != '(')
            newexp[i++] = stack[top];
        top--;
    }
        
    
}

void print(char exp[])
{
    for(int i=0; exp[i] != '#'; i++)
        printf("%c", exp[i]);
}

int main()
{
    char exp[maxsize];
    char x; int i=0;
    printf("请输入正确的表达式:\n");
    
    while(x != '#')
    {
        x = getchar();
        exp[i++] = x;
    }
    getchar();  //用于接收回车键
    
    char newexp[maxsize];
    for(int i=0; i<maxsize; i++)
        newexp[i] = '#';
    trans_post_exp(exp, newexp);
    
    print(newexp);

    return 0;
}


你可能感兴趣的:(3.21√ 将一个通常书写形式且书写正确的表达式转换为逆波兰式。)