Note that there are some explanatory texts on larger screens.

plurals
  1. POCan this Python postfix notation (reverse polish notation) interpreter be made more efficient and accurate?
    primarykey
    data
    text
    <p>Here is a Python postfix notation interpreter which utilizes a stack to evaluate the expressions. Is it possible to make this function more efficient and accurate? </p> <pre><code>#!/usr/bin/env python import operator import doctest class Stack: """A stack is a collection, meaning that it is a data structure that contains multiple elements. """ def __init__(self): """Initialize a new empty stack.""" self.items = [] def push(self, item): """Add a new item to the stack.""" self.items.append(item) def pop(self): """Remove and return an item from the stack. The item that is returned is always the last one that was added. """ return self.items.pop() def is_empty(self): """Check whether the stack is empty.""" return (self.items == []) # Map supported arithmetic operators to their functions ARITHMETIC_OPERATORS = {"+":"add", "-":"sub", "*":"mul", "/":"div", "%":"mod", "**":"pow", "//":"floordiv"} def postfix(expression, stack=Stack(), operators=ARITHMETIC_OPERATORS): """Postfix is a mathematical notation wherein every operator follows all of its operands. This function accepts a string as a postfix mathematical notation and evaluates the expressions. 1. Starting at the beginning of the expression, get one term (operator or operand) at a time. * If the term is an operand, push it on the stack. * If the term is an operator, pop two operands off the stack, perform the operation on them, and push the result back on the stack. 2. When you get to the end of the expression, there should be exactly one operand left on the stack. That operand is the result. See http://en.wikipedia.org/wiki/Reverse_Polish_notation &gt;&gt;&gt; expression = "1 2 +" &gt;&gt;&gt; postfix(expression) 3 &gt;&gt;&gt; expression = "5 4 3 + *" &gt;&gt;&gt; postfix(expression) 35 &gt;&gt;&gt; expression = "3 4 5 * -" &gt;&gt;&gt; postfix(expression) -17 &gt;&gt;&gt; expression = "5 1 2 + 4 * + 3 -" &gt;&gt;&gt; postfix(expression, Stack(), ARITHMETIC_OPERATORS) 14 """ if not isinstance(expression, str): return for val in expression.split(" "): if operators.has_key(val): method = getattr(operator, operators.get(val)) # The user has not input sufficient values in the expression if len(stack.items) &lt; 2: return first_out_one = stack.pop() first_out_two = stack.pop() operand = method(first_out_two, first_out_one) stack.push(operand) else: # Type check and force int try: operand = int(val) stack.push(operand) except ValueError: continue return stack.pop() if __name__ == '__main__': doctest.testmod() </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload