中缀转后缀表达式
在中缀变后缀时,操作数的顺序不会发生变化,只有运算符的顺序可能发生变化。同时又没有括号。所以在转换的过程中,只要碰到操作数,可以直接输出,而遇到运算符和括号进行相应的处理即可。
转换原则如下:
1.从左到右读取一个中序表达式。
2.若读取的是操作数,则直接输出。
3.若读取的是运算符,分三种情况。
-
该运算符为左括号( ,则直接存入堆栈。
-
该运算符为右括号),则输出堆栈中的运算符,直到取出左括号为止。
-
该运算符为非括号运算符,则与堆栈顶端的运算符做优先权比较:
-
- 如果当前运算符优先级高于栈顶运算符,则直接入栈。
- 如果当前运算符优先级低于等于栈顶运算符,则弹出栈顶运算符并输出,直到当前运算符优先级大于栈顶运算符或者栈空为止,然后将当前运算符入栈。
4.当表达式已经读取完成,而堆栈中尚有运算符时,则依次序取出运算符,直到堆栈为空,由此得到的结果就是中缀表达式转换成的后缀表达式。
逆波兰 - 上(中缀表达式 转 后缀表达式)_哔哩哔哩_bilibili
中缀表达式求值
中缀表达式求值通常涉及使用栈来处理运算符和操作数。以下是中缀表达式求值的基本步骤:
-
定义两个栈,一个用于存储操作数,另一个用于存储运算符。
-
遍历中缀表达式的每个字符,如果遇到操作数(数字),则将其压入操作数栈。
-
如果遇到运算符,则将其与运算符栈的栈顶元素比较优先级:
-
- 如果运算符的优先级高于栈顶元素的优先级,将其压入运算符栈。
- 如果运算符的优先级低于或者等于栈顶元素的优先级,则从操作数栈弹出两个操作数进行计算,并将结果压入操作数栈,同时将运算符栈中优先级低于或等于当前运算符的元素依次弹出并处理,直到遇到一个优先级高于当前运算符的元素或栈为空。
-
如果遇到左括号“(”,则直接将其压入运算符栈。
-
如果遇到右括号“)”,则从运算符栈弹出并处理运算符,直到遇到左括号“(”为止。
-
遍历完成后,如果运算符栈中还有元素,则从操作数栈弹出两个操作数进行计算,并将结果压回操作数栈。
-
最后,操作数栈中剩下的元素(如果有)就是表达式的求值结果。
这种方法的关键在于正确处理运算符的优先级和括号。
后缀表达式求值
后缀表达式,也称为逆波兰表达式,是一种没有操作符优先级的表达式(也没有左右括号),因此求值过程相对直接。求值过程通常涉及使用一个栈来辅助存储操作数,并按照以下步骤进行:
- 遍历后缀表达式中的每个元素。
- 如果遇到操作数(通常是数字),则将其压入栈中。
- 如果遇到操作符,则从栈中弹出两个操作数进行计算,并将结果压回栈中。
- 这个过程持续直到后缀表达式中的所有元素都被处理,最终栈中剩下的就是表达式的计算结果。
逆波兰 - 下(后缀表达式计算结果)_哔哩哔哩_bilibili