中缀表达式转换为后缀表达式的算法

来源:互联网 发布:丧尸围城2优化补丁 编辑:程序博客网 时间:2024/06/07 03:44

中缀表达式转换为后缀表达式的算法

  1. 中缀表达式与后缀表达式
    (1) 中缀表达式
    表达形式是运算符在两个操作符之间(例如:4+5),它适合人的阅读和计算习惯对机器相对复杂
    (2) 后缀表达式
    表达形式是运算符在两个操作符之后(例如:4 5 +),它适合计算机的计算

  2. 中缀表达式转换为后缀表达式的算法
    (1)从左向右逐个遍历中缀表达式;
    (2)若字符是数字,则存入后缀表达式;
    (3)若字符是’(‘,则存入栈;
    (4)若字符是’)’,则从栈顶依次逐个读取并删除栈顶元素后,将栈顶元素存入后缀表达式,直到值是’(‘,从栈中除’(‘;
    (5)若字符是’’或’/’
    如果栈顶元素优先级比’(‘高,就直接入栈;
    否则从栈顶依次逐个读取并删除栈顶元素后,将栈顶元素存入后缀表达式,直至遇到优先级比它低或值为’(‘,字符 入栈;
    (6)若字符是’+’或’-‘
    如果栈顶元素优先级比’(‘高,就直接入栈;
    否则从栈顶依次逐个读取并删除栈顶元素后,将栈顶元素存入后缀表达式,直至值为’(‘,字符入栈;

  3. 举例( 4(5+6)-7+8 )
    4 |
    4 |
    4 | (
    4 5 | * (
    4 5 | * ( +
    4 5 6 | * ( +
    4 5 6 + |
    4 5 6 + | -
    4 5 6 + * 7 | -
    4 5 6 + * 7 - | +
    4 5 6 + * 7 - 8 | +
    4 5 6 + * 7 - 8 + |
    (用’|’隔开后缀表达式和栈)

  4. 代码

/*中缀表达式的格式:每个数字后面加'.'(举例:4.+5.*(6.+7.))*/void ExpMidToExpBak(char * expMiddle,char * expBack){    STACK1 S1;//建立一个存储字符的栈    int i = 0;    int j = 0;    char ch;    InitStack(&S1);//初始化栈    while('\0' != expMiddle[i])    {        if(isdigit(expMiddle[i]))//判断是否是数字        {            do            {                expBack[j] = expMiddle[i];                j++;                i++;            }while('.' != expMiddle[i]);            expBack[j] = '.';            j++;        }        else if('(' == expMiddle[i])        {            PushStack(&S1,expMiddle[i]);//将字符压入栈        }        else if(')' == expMiddle[i])        {            GetDelTop(&S1,&ch);//获取并删除栈顶元素            while('(' != ch)            {                expBack[j] = ch;                j++;                GetDelTop(&S1,&ch);            }        }        else if('*' == expMiddle[i] || '/' == expMiddle[i])        {            if(!EmptyStack(&S1))//判断栈是否为空            {                ch = GetTop(&S1);//读取栈顶元素                while(1)                {                    expBack[j] = ch;                    j++;                    PopStack(&S1);//出栈                    if(EmptyStack(&S1))                    {                        break;                    }                    else                    {                        ch = GetTop(&S1);                    }                }                           }            PushStack(&S1,expMiddle[i]);        }        else if('+' == expMiddle[i] || '-' == expMiddle[i])        {            if(!EmptyStack(&S1))            {                ch = GetTop(&S1);                while('(' != ch)                {                    expBack[j] = ch;                    j++;                    PopStack(&S1);                    if(EmptyStack(&S1))                    {                        break;                    }                    else                    {                        ch = GetTop(&S1);                    }                }                           }            PushStack(&S1,expMiddle[i]);        }        i++;    }    while(!EmptyStack(&S1))     {        GetDelTop(&S1,&expBack[j++]);    }    expBack[j]='\0';//必须加入字符串的结束符是'\0'    return;}
1 0
原创粉丝点击