1、题目
给定一个中缀表达式转换为后缀表达式。
注意:
1.操作数和操作符之间由空格隔开【中缀表达式是一系列以空格隔开的单词(token)组成】.
2.操作数既可以是数字也可以是英文大写字母
2、表达式的相关定义
中缀表达式:操作符介于操作数之间。为保证运算顺序,引入了操作符的优先级以及括号强制优先级。
全括号中缀表达式:中缀表达式中所有的子表达式都加上括号。为保证运算顺序,只需要括号强制优先级
前缀表达式:操作符与操作数分别集中分布,而且操作符集体位于操作数之前。为保证运算顺序,只需规定操作符只和它后面紧跟的两个数进行运算,不需要操作符以及括号优先级。
后缀表达式:操作符与操作数分别集中分布,而且操作符集体位于操作数之后。为保证运算顺序,只需规定操作符只和它前面紧跟的两个数进行运算,不需要操作符以及括号优先级。
3、表达式的转换【通用,但是此题解法不涉及该转换方法】
中缀表达式转前缀表达式:把每一个子表达式的左括号代替为此表达式的运算符,并删去原位置的运算符和右括号
中缀表达式转后缀表达式:把每一个子表达式的右括号代替为此表达式的运算符,并删去原位置的运算符和左括号
4、代码实现的分析
对象 | 相应处理 |
---|---|
操作数 | 因为几种表达式中操作数的顺序不变,因而直接存储到待输出列表即可 |
操作符 + * - / ^ | 1.中缀表达式的操作符顺序和后缀表达式的操作符顺序相反,因而采用栈来存储操作符。2.后缀表达式的操作符先后顺序代表了操作符的优先级顺序,因而在操作符入栈之前需要比较和栈顶操作符的优先级。 |
括号() | 左括号直接入栈,遇到右括号时一直pop栈顶元素加入待输出列表,直至pop到了左括号。原因是括号内的操作符优先级要高于括号外的 |
5、代码
#栈的实现(利用列表)
class Stack:
def __init__(self):
self.items=[]
def isEmpty(self):