用栈实现表达式转换(中缀转后缀、中缀转前缀)-----栈和队列的应用2

中缀转后缀

  1. 将输入的字符串从左到右扫描;
  2. 若当前字符是操作数则直接打印;
  3. 若当前字符是运算符,先判断栈是否为空,若是,则直接将此操作符压入栈;若不是,则查看栈顶运算符,若当前运算符优先级<=栈顶运算符优先级,就把栈顶运算符出栈并写入当前得到的结果表达式。循环这个过程,直到当前运算符优先级>栈顶运算符优先级,则将扫描到的运算符入栈;
  4. 若当前字符是左括号则直接压入栈;
  5. 若当前栈顶运算符是左括号则直接将当前运算符入栈;
  6. 若当前字符是右括号则打印并弹出栈中第一个左括号前的所有运算符,并且将左括号弹出但不写入(右括号永远不入栈)。
  7. 当扫描完原中缀表达式所有字符时若栈中还有剩余运算符,则全部出栈并写入结果表达式中(从栈顶开始出,因为栈要后进先出)。
    在这里插入图片描述
    图中白线代表栈的容量至少是5。

中缀转后缀的手算方法:
① 确定中缀表达式中各个运算符的运算顺序
② 选择下一个运算符,按照「左操作数 右操作数 运算符」的方式组合成一个新的操作数
③ 如果还有运算符没被处理,就继续 ②
“左优先”原则:只要左边的运算符能先计算,就优先算左边的

中缀转后缀的机算方法:
初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。
从左到右处理各个元素,直到末尾。可能遇到三种情况:
① 遇到操作数。直接加入后缀表达式。
② 遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式,直到
弹出“(”为止。注意:“(”不加入后缀表达式。
③ 遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,
若碰到“(” 或栈空则停止。之后再把当前运算符入栈。
按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。


中缀转前缀

  1. 将输入的字符串从右到左扫描;
  2. 若当前字符是操作数则直接打印;
  3. 若当前字符是运算符,先判断栈是否为空,若是,则直接将此操作符压入栈;若不是,则查看栈顶运算符,若当前运算符优先级<栈顶运算符优先级,就把栈顶运算符出栈并写入当前得到的结果表达式。然后当前运算符继续循环这个过程,直到当前运算符优先级>=栈顶运算符优先级,则将扫描到的运算符入栈;
  4. 若当前字符是右括号则直接压入栈;
  5. 若当前栈顶运算符是右括号则直接将当前运算符入栈;
  6. 若当前字符是左括号则打印并弹出栈中第一个右括号前的所有运算符,并且将右括号弹出但不写入(左括号永远不入栈);
  7. 当扫描完原中缀表达式所有字符时若栈中还有剩余运算符,则全部出栈并写入结果表达式中(从栈顶开始出,因为栈要后进先出)。
    在这里插入图片描述

后缀转前缀

在这里插入图片描述
每次扫描到一个运算符时就把这个运算符所对应的两个子表达式移到运算符后边。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章