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