Stack experiment
Steve Holden
steve at holdenweb.com
Tue Apr 3 12:17:52 EDT 2007
tom at finland.com wrote:
> Hi! Im new to Python and doing exercise found from internet. It is
> supposed to evaluate expression given with postfix operator using
> Stack() class.
>
> class Stack:
> def __init__(self):
> self.items = []
>
> def push(self, item):
> self.items.append(item)
>
> def pop(self):
> return self.items.pop()
>
> def isEmpty(self):
> return (self.items == [])
>
> def evaluatePostfix(expr):
> import re
> tokenList = re.split(" ([^0-9])", expr)
If you add a print statement here I think you will find that the
tokenisation here isn't really what you want:
>>> expr = "56 47 + 2 *"
>>> re.split(" ([^0-9])", expr)
['56 47', '+', ' 2', '*', '']
> stack = Stack()
> for token in tokenList:
> if token == '' or token == ' ':
> continue
> if token == '+':
> sum = stack.pop() + stack.pop()
> stack.push(sum)
> elif token == '*':
> product = stack.pop() * stack.pop()
> stack.push(product)
> else:
> stack.push(int(token))
> return stack.pop()
>
> print evaluatePostfix("56 47 + 2 *")
>
> Errormsg:
> Traceback (most recent call last):
> File "C:\*\postfix1.py", line 31, in <module>
> print evaluatePostfix("56 47 + 2 *")
> File "C:\*\postfix1.py", line 28, in evaluatePostfix
> stack.push(int(token))
> ValueError: invalid literal for int() with base 10: '56 47'
>
> How can I avoid the error and get desired result?
I'd try using
tokenList = split(expr)
instead - this has the added benefit of removing the spaces, so you can
simplify your code by removing the case that handles empty tokens and
sapaces, I suspect.
regards
Steve
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
Recent Ramblings http://holdenweb.blogspot.com
More information about the Python-list
mailing list