情况是这样的,我在用Python做一个中缀表达式转换为后缀表达式的程序时,发现只能对个位数进行处理,如果遇到“12+3”这样的表达式,我的程序只能把它识别为["1","2","+","3"]而不是["12","+","3"],导致运算出错,请问各位这个问题怎么解决呀?
我也有过您的困惑🤪🤪。我是先把表达式拆分成列表。
#!/sur/bin/nve python
# coding: utf-8
def exp_to_list(s):
result = []
num = ''
for i in s:
if i.isdigit():
num += i
else:
result.append(num)
num = ''
result.append(i)
result.append(num)
return result
if __name__ == '__main__':
s = '12+3'
print(f"\n{s} -> {exp_to_list(s)}")
#!/sur/bin/nve python
# coding: utf-8
from re import findall
def exp_to_list(s):
a, b = findall(r'\d+', s), [i for i in s if not i.isdigit()]
result = [list(i) for i in zip(a, b + [''])]
return [i for i in sum(result, []) if i]
if __name__ == '__main__':
s = '12+3'
print(f"\n{s} -> {exp_to_list(s)}")
别着急入栈,先判断如果当前是非数字,前面是数字,那就把数字和非数字都入栈
如果当前是数字,前面是非数字,就先把非数字入栈,数字先用变量存起来
如果当前和前面都是数字,做个字符串拼接
# 先序遍历
def preorder_traversal(node):
ls = []
while True:
# 节点不为空时
while node:
print('%3s' % node, end='')
# 入栈
ls.append(node)
# 进入左节点
node = node.left
# 栈为空时退出
if ls == []:
break
# 出栈
node = ls.pop()
# 进入右节点
node = node.right
# 中序遍历
def inorder_traversal(node):
ls = []
while True:
# 节点不为空时
while node:
# 入栈
ls.append(node)
# 进入左节点
node = node.left
# 栈为空时退出
if ls == []:
break
# 出栈
node = ls.pop()
print('%3s' % node, end='')
# 进入右节点
node = node.right
# 后序遍历,难度较大,以后再补充
def postorder_traversal(node):
pass
# traversal
ls = [chr(i) for i in range(65, 91)]
fbt = FBT(ls)
print('\npreorder')
preorder_traversal(fbt.nodes[0])
print('\ninorder')
inorder_traversal(fbt.nodes[0])
打印结果同上,不作重复
解决方案: 可以使用正则表达式来提取多位数字。具体步骤如下:
以下是具体的代码实现:
import re
def extract_expression(expression):
# 提取所有多位数字
numbers = re.findall(r'\d+', expression)
# 替换掉多位数字为空格
processed_expression = re.sub(r'\d+', ' ', expression)
# 将多位数字和运算符一起添加到列表中
result = []
for number in numbers:
result.append(number)
if processed_expression:
result.append(processed_expression[0]) # 添加第一个非数字字符
return result
expression = "12+3"
result = extract_expression(expression)
print(result) # 输出:["12", "+", "3"]
通过正则表达式的re.findall()
方法,可以方便地提取字符串中的多位数字。然后将提取到的多位数字和运算符一起添加到列表中,得到最终的结果。