python程序案例 化学-用Python解析化学公式

问题是:给定类似C(Mg2(OH)4)2的公式,返回包含元素及其计数的哈希表.元素名称始终以大写字母开头,并且可以以小写字母开头.

我认为我首先要解决最简单的情况:没有括号.

def bracket_hash(formula):

element = ""

atom_count = 0

element_hash = {}

for x in formula:

if x.isupper():

if element!="":

element_hash[element] = 1

element = ""

element = x

elif x.islower():

element += x

else:

element_count = int(x)

element_hash[element] = element_count

element_count = 0

element = ""

if element!="":

element_hash[element] = 1

return element_hash

此代码在以下情况下可以正常工作:

print(bracket_hash("H2O"))

print(bracket_hash("CO2"))

print(bracket_hash("Mg2O4"))

print(bracket_hash("OH"))

现在我认为必须以某种方式使用堆栈来处理OH(Ag3(OH)2)4等多括号的情况,这里Ag的计数必须为3 * 4,O和H的计数必须为2 * 4 1.

到目前为止,我开始是这样的:

def formula_hash(formula):

stack = []

final_hash = {}

cur = ""

i = 0

while i < len(formula):

if formula[i] == "(":

j = i

while formula[j]!=")":

j = j + 1

cur = formula[i:j]

stack.append(bracket_hash(cur))

cur = ""

i = j + 1

但是现在我被困住了.

随着编码问题变得越来越长,并且涉及到混合数据结构来解决,我有点陷入困境.在这里,他们使用哈希表和堆栈.

所以我的问题是:如何将这个问题分解为可管理的部分并加以解决.如果确实要解决此问题,则必须将其映射到可管理的代码段.任何帮助将不胜感激.

谢谢.

解决方法:

我认为您可以使用递归来解决此问题.这是您的函数应如何工作:

>就像您在第一个代码中一样,直到遇到左括号.

>遇到左括号,请找到相应的右括号.这可以通过一个计数器来完成:将其初始化为1,然后在遇到新的右括号时,将计数器递增,而在遇到右括号时,将其递减.当计数器等于0时,您已找到匹配的右括号.

>在括号之间剪切字符串,并使用该字符串调用相同的函数(这是递归方面).

>将返回的字典中的值添加到当前字典中,然后乘以括号后面的数字.

如果您在实施此解决方案的某些部分时遇到问题,请告诉我,我将提供更多详细信息.

编辑:关于堆栈方法

堆栈方法只是模拟递归.它具有一堆计数器,而不是再次调用该函数并具有本地计数器.当打开括号时,它会在此上下文中计数;当关闭括号时,它将与包含它的上下文合并,并具有相应的多重性.

到目前为止,我更喜欢递归方法,这种方法更自然.

标签:data-structures,stack,hash,python,algorithm

来源: https://codeday.me/bug/20191025/1927824.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值