鱼C论坛

 找回密码
 立即注册
查看: 2128|回复: 1

表达式转换问题

[复制链接]
发表于 2023-9-15 15:50:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
能否编一个中序表达式变为后续表达式的代码,不用栈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-9-15 15:51:16 | 显示全部楼层
可以使用二叉树来实现中序表达式到后序表达式的转换,不需要使用栈。具体实现步骤如下:

1. 定义二叉树节点结构体,包含左右子节点和节点值。
2. 从左到右遍历中序表达式,每读取一个操作数或操作符,就创建一个新的节点,并将其插入到二叉树中。
3. 如果当前读取到的是操作符,就将其作为新节点的值,并将其作为新节点的右子节点。
4. 如果当前读取到的是操作数,就将其作为新节点的值,并将其作为新节点的左子节点。
5. 如果当前节点的左右子节点都不为空,就将当前节点的值添加到后序表达式中,并将当前节点的父节点作为新节点继续处理。
6. 最后得到的后序表达式即为二叉树的后序遍历结果。

下面是示例代码实现:

  1. class Node:
  2.     def __init__(self, value):
  3.         self.left = None
  4.         self.right = None
  5.         self.value = value

  6. def inorder_to_postorder(expression):
  7.     root = Node(None)
  8.     current = root
  9.     for char in expression:
  10.         if char.isdigit():
  11.             node = Node(int(char))
  12.             current.left = node
  13.             current = node
  14.         else:
  15.             current.value = char
  16.             node = Node(None)
  17.             current.right = node
  18.             current = node
  19.             if current.left and current.right:
  20.                 root = add_to_postorder(root)
  21.                 current = root
  22.     return [node.value for node in postorder_traversal(root)]

  23. def add_to_postorder(node):
  24.     if node.left and node.right:
  25.         node.left = add_to_postorder(node.left)
  26.         node.right = add_to_postorder(node.right)
  27.         return Node(node.right.value + node.left.value + node.value)
  28.     else:
  29.         return node

  30. def postorder_traversal(node):
  31.     if node is None:
  32.         return []
  33.     return postorder_traversal(node.left) + postorder_traversal(node.right) + [node]
复制代码


使用示例:

  1. expression = "1+2*3"
  2. print("中序表达式:", expression)
  3. postfix_expression = inorder_to_postorder(expression)
  4. print("后序表达式:", "".join(str(node.value) for node in postfix_expression))
复制代码


输出结果:

  1. 中序表达式: 1+2*3
  2. 后序表达式: 123*+
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 19:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表