📅  最后修改于: 2023-12-03 15:28:41.415000             🧑  作者: Mango
给出一个由数字和运算符组成的算术表达式(不含括号),请编写程序将其转换为逆波兰式(也称后缀表达式)。
一行,包含一个由数字和运算符组成的算术表达式,其中数字和运算符之间用空格隔开。
运算符包括 +、-、*、/ 和 ^,分别表示加法、减法、乘法、除法和指数运算。
一行,为逆波兰式后缀表达式,数字和运算符之间同样用空格隔开。
注意不包含括号。
3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3
3 4 2 × 1 5 − 2 3 ^ ^ ÷ +
将中缀表达式转换为后缀表达式,需要用到栈。 从左向右扫描中缀表达式,数字和左括号直接输出,遇到运算符则与栈顶运算符的优先级进行比较,如果当前运算符的优先级小于等于栈顶的运算符优先级,则将栈顶运算符输出并弹出栈,循环比较之前的规则,直到遇到一个优先级小于当前运算符的栈顶元素,此时将当前运算符入栈。 一直到扫描完中缀表达式,将栈内所有运算符弹出并输出。
def infix2Postfix(expr):
stack = []
output = []
priority = {'+':1, '-':1, '*':2, '/':2, '^':3}
for token in expr.split(' '):
if token.isdigit():
output.append(token)
elif token in '+-*/^':
while stack and stack[-1] in '+-*/^' and priority[stack[-1]] >= priority[token]:
operator = stack.pop()
output.append(operator)
stack.append(token)
while stack:
operator = stack.pop()
output.append(operator)
return ' '.join(output)
给出一个由数字和运算符组成的算术表达式(不含括号),请编写程序将其转换为逆波兰式(也称后缀表达式)。
一行,包含一个由数字和运算符组成的算术表达式,其中数字和运算符之间用空格隔开。
运算符包括 +、-、*、/ 和 ^,分别表示加法、减法、乘法、除法和指数运算。
一行,为逆波兰式后缀表达式,数字和运算符之间同样用空格隔开。
注意不包含括号。
3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3
3 4 2 × 1 5 − 2 3 ^ ^ ÷ +
将中缀表达式转换为后缀表达式,需要用到栈。 从左向右扫描中缀表达式,数字和左括号直接输出,遇到运算符则与栈顶运算符的优先级进行比较,如果当前运算符的优先级小于等于栈顶的运算符优先级,则将栈顶运算符输出并弹出栈,循环比较之前的规则,直到遇到一个优先级小于当前运算符的栈顶元素,此时将当前运算符入栈。 一直到扫描完中缀表达式,将栈内所有运算符弹出并输出。
def infix2Postfix(expr):
stack = []
output = []
priority = {'+':1, '-':1, '*':2, '/':2, '^':3}
for token in expr.split(' '):
if token.isdigit():
output.append(token)
elif token in '+-*/^':
while stack and stack[-1] in '+-*/^' and priority[stack[-1]] >= priority[token]:
operator = stack.pop()
output.append(operator)
stack.append(token)
while stack:
operator = stack.pop()
output.append(operator)
return ' '.join(output)