有“+”时如何求和?

2024-03-29 08:34:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用post-fix符号和堆栈,我想知道当字符串'+'存在时,是否/如何对列表、堆栈等的元素求和?你知道吗

例如,我将使用一个列表而不是一个堆栈(尽管如果您有一个针对堆栈的解决方案,请务必继续)。你知道吗

所以,如果我有:

string = '1 2 3 +'

把它变成一个列表:

['1','2','3','+']

如果正确,将评估为:

6

以下是我认为可行的方法(注意:我所做的valid()函数检查是否可以将其更改为基于字符串的浮点值。它工作正常):

def post_fix(string):
     lst = []
     for i in string:
         if '(' in lst:
             pass
         elif valid(i) is True:      
             int(i)
             lst.append(i)
         elif '+' in string:
             '+' == sum(lst)
             print(sum(lst))

  post_fix('1 2 3 +')

我怎样才能使它工作,以便如果存在“+”或“-”等,它将执行适当的操作?你知道吗

注意:为简单起见,您可以假设运算符始终位于末尾。所以不要担心像“12+34*”这样的事情,尽管如果你有一个解决方案,它会非常感激。你知道吗


Tags: 方法字符串in元素列表string堆栈符号
3条回答

使用堆栈计算后缀符号。当你看到一个数字,你就把它推到堆栈上。当你看到一个操作符时,你弹出足够多的数字来满足它并推送结果。最后,堆栈应该只有一个项目,您可以打印它。你知道吗

现在通常+是一个二进制运算符:它需要两个操作数。在您的情况下,您希望它消耗堆栈上的任何内容。对于+来说,这是一个非常规的含义,但它的实现非常简单。你知道吗

def postfix(tokens):
    stack = []
    tokens = tokens.split() if isinstance(tokens, str) else tokens
    for token in tokens:
        if token.isdigit() or token.startswith("-") and token[1:].isdigit():
            stack.append(int(token))
        elif token == "+":
            assert stack    # need at least one item
            result = 0
            while stack:
               result += stack.pop()
            stack.append(result)
        else:
            raise ValueError("invalid token {}".format(token))
    assert len(stack) == 1
    return stack[0]

print(postfix("1 2 3 +"))

这种结构很容易扩展到处理其他操作。例如,可以使用+进行二进制加法,++进行全和运算。你知道吗

elif token == "++":   # sum all
    result = 0
    while stack:
       result += stack.pop()
    stack.append(result)
elif token == "+":    # binary additon
    stack.append(stack.pop() + stack.pop())
the_list = ['1','2','3','+'] 
if '+' in the_list:
    #do things related to it being present

我相信你甚至不需要把它转换成一个列表(尽管它可以使后续的数字处理更容易)。比如:

if '+' in '1 2 3 +':

也应该执行,因为字符串在pyton中被视为iterables

这里有几个问题。第一个是int(i)。这不会将i的副本创建为整数,但根本不会修改i。附加到列表的i仍然是一个字符串。第二个问题是,这不适用于两位数的数字-您会立即附加到列表中,而不是跟踪可能的两位数。你知道吗

解决这些问题:

def valid(i):
  return i.isdigit()

def post_fix(string):
  lst = [0]
  for i in string:
    if i == '(':
      continue
    elif i == ' ':
      lst.append(0)
    elif valid(i):      
      lst[-1] *= 10
      lst[-1] += int(i)
    elif i == '+':
      print(sum(lst))

post_fix('1 2 3 +')

输出:

6

相关问题 更多 >