后缀表达式转换算法:非递归实现
后缀表示法是一种书写不带括号的算术表达式的简明方法。它是这样定义的:如果'(exp OP exp)' 是一个普通、完整的括号表达式,它的操作符是 OP,那么它的后缀版本为 'pexp1 pexp2 OP',其中 pexp1 是 exp1 的后缀表示形式,pexp2 是 exp2 的后缀表示形式。一个单一的数字或变量的后缀表示形式就是这个数字或变量。例如,'( (5+2)*(8-3))/4' 的后缀版本为 '5 2 + 8 3 - * 4 /'。
非递归方式的后缀表达式转换算法可以使用栈来实现。具体步骤如下:
- 初始化一个空栈和一个空字符串用于存储后缀表达式。
- 从左到右遍历原始表达式中的每个字符:
- 如果字符是数字或变量,则直接将其添加到后缀表达式字符串中。
- 如果字符是操作符,则将其与栈顶操作符进行比较:
- 如果栈为空或栈顶操作符是左括号,则将当前操作符入栈。
- 如果当前操作符的优先级大于栈顶操作符的优先级,则将当前操作符入栈。
- 如果当前操作符的优先级小于或等于栈顶操作符的优先级,则将栈顶操作符出栈并添加到后缀表达式字符串中,直到栈顶操作符的优先级小于当前操作符的优先级或栈为空,然后将当前操作符入栈。
- 如果字符是左括号,则将其入栈。
- 如果字符是右括号,则将栈顶操作符出栈并添加到后缀表达式字符串中,直到遇到左括号为止,然后将左括号出栈。
- 遍历完所有字符后,将栈中剩余的操作符依次出栈并添加到后缀表达式字符串中。
- 返回后缀表达式字符串作为结果。
例如,对于原始表达式 '( (5+2)*(8-3))/4' 的后缀表达式转换过程如下:
- 初始化栈和后缀表达式字符串为空。
- 遍历原始表达式中的字符:
- 遇到左括号'(',入栈。
- 遇到左括号'(',入栈。
- 遇到数字'5',添加到后缀表达式字符串中。
- 遇到操作符'+',入栈。
- 遇到数字'2',添加到后缀表达式字符串中。
- 遇到右括号')',将栈顶操作符'+'出栈并添加到后缀表达式字符串中。
- 遇到操作符'*',入栈。
- 遇到左括号'(',入栈。
- 遇到数字'8',添加到后缀表达式字符串中。
- 遇到操作符'-',入栈。
- 遇到数字'3',添加到后缀表达式字符串中。
- 遇到右括号')',将栈顶操作符'-'出栈并添加到后缀表达式字符串中。
- 遇到右括号')',将栈顶操作符'*'出栈并添加到后缀表达式字符串中。
- 遇到操作符'/',入栈。
- 遇到数字'4',添加到后缀表达式字符串中。
- 遍历完所有字符后,将栈中剩余的操作符'/'出栈并添加到后缀表达式字符串中。
- 返回后缀表达式字符串'5 2 + 8 3 - * 4 /'作为结果。
因此,非递归方式的后缀表达式转换算法的实现如下(使用Python语言):
def infix_to_postfix(expression):
stack = []
postfix_expression = ""
operators = {'+': 1, '-': 1, '*': 2, '/': 2}
for char in expression:
if char.isdigit():
postfix_expression += char
elif char in operators:
while stack and stack[-1] != '(' and operators[char] <= operators.get(stack[-1], 0):
postfix_expression += stack.pop()
stack.append(char)
elif char == '(':
stack.append(char)
elif char == ')':
while stack and stack[-1] != '(':
postfix_expression += stack.pop()
stack.pop()
while stack:
postfix_expression += stack.pop()
return postfix_expression
使用该算法,可以将原始表达式转换为后缀表达式。
原文地址: https://www.cveoy.top/t/topic/pain 著作权归作者所有。请勿转载和采集!