2016-11-12 29 views
0

所以我的代码,以使逆波兰式的工作逆波兰式 - 监测输入

def rpn(x): 
    stack = [] 
    operators=['+', '-', '*'] 

    for i in x.split(' '): 
     if i in operators: 
      op1 = stack.pop() 
      op2 = stack.pop() 
      if i=='+': result = op2 + op1 
      if i=='-': result = op2 - op1 
      if i=='*': result = op2 * op1 
      stack.append(result) 
     else: 
      stack.append(float(i)) 

    return stack.pop() 


x = str(input("Enter a polish expression:")) 
result = rpn(x) 
print (result) 

但是我挣扎于如何为特定输入 目前该代码提供了一些错误信息将只工作,如果我有即每个值后面输入一个空格 3 4 +再生病得到7

结果,但我想让它,这样它要么

- 移除的间距自动

或代码只会无间距工作,如果有间距 提供一个错误我想添加一些代码沿

if x contains " ": 
    print("error") 

我的第二个问题,我正在努力工作线限制使用的操作符 因此,如果它有数字和3个操作符(+, - ,*),如果有其他操作符或字母会显示错误,它将只运行代码。再次我的想法将是

if x contains something other than "integers and +,-,*: 
    then print an error 

再次,我有概念,但没有关于如何执行它的python关键字知识。

+1

没有空格你如何确定一个数字何时结束?除非每个数字都是一个数字。 – AChampion

+0

嗯,我应该提到的确,它只会是单个数字 – Xrin

+0

你可以通过遍历'x.strip()'并放弃空格。 – AChampion

回答

1

您应该使用x.split()而不是x.split(' '),它会提取除x之外的所有空格。

split()将多个连续空格视为一个空格(所以一个分隔符),而split(' ')将一个空格视为一个分隔符。

这里的区别:

>>> print(' '.split(' ')) 
['', '', '', ''] 
>>> print(' '.split()) 
[] 

鉴于你的代码将只处理单位数:

for i in (_ for _ in x if not _.isspace()): 
    # your algorithm 

如果你想提高一个错误:

for i in (_ if not _.isspace() else None for _ in x): 
    if i is None: 
     raise ValueError("Error!") 
    # your algorithm here 
+0

这是有道理的,但现在让我们说我们输入作为输入(34 +)它会显示一个错误,因为我试图将字符串转换为浮动。那么删除真正解决我的问题的空间?或者这是否意味着我的代码不能工作,除非它有空格? – Xrin

+0

但是'34 +'没有任何意义。这与'34 + WHAT ??'相同。 – ForceBru

+0

以RPM计算的井34+与3 + 4相同 – Xrin