def convert(self):
        # cache the result
        if not self._pfTokens:
            # save the converted expression (tokens)
            self._pfTokens = []
            # stack to store operators and operands
            stack = LinkedStack()
            for token in self._scanner:
                # append the operand to list
                if not token.isOperator():
                    self._pfTokens.append(token)
                # Token.OPENPAREN & Token.CLOSEPAREN are operators,
                # so must be called before token.isOperator().
                elif token.getType() == Token.OPENPAREN:
                    stack.push(token)
                elif token.getType() == Token.CLOSEPAREN:
                    for i in range(len(stack)):
                        operator = stack.pop()
                        if operator.getType() == Token.OPENPAREN:
                            break
                        self._pfTokens.append(operator)
                elif token.isOperator():
                    # pop operators in the stack whose precedence is not smaller
                    for i in range(len(stack)):
                        if (stack.peek().getType() == Token.OPENPAREN
                                or stack.peek().getPrecedence() <
                                token.getPrecedence()):
                            break
                        self._pfTokens.append(stack.pop())
                    stack.push(token)

            for i in range(len(stack)):
                self._pfTokens.append(stack.pop())

        return self._pfTokens
Ejemplo n.º 2
0
 def is_palindrome(word):
     stack = LinkedStack()
     for index in range(len(word) // 2):
         stack.push(word[index])
     for index in range((len(word) + 1) // 2, len(word)):
         if stack.peek() == word[index]:
             stack.pop()
         else:
             return False
     return True
Ejemplo n.º 3
0
class Translator(object):
    """Translates infix expressions to postfix expressions."""

    def __init__(self, scanner):
        """Sets the initial state of the translator."""
        self._expressionSoFar = ""
        self._operatorStack = LinkedStack()
        self._scanner = scanner


    def translate(self):
        """Returns a list of tokens that represent the postfix
        form of sourceStr.  Assumes that the infix expression
        in sourceStr is syntactically correct"""
        postfix = list()
        for currentToken in self._scanner:
            self._expressionSoFar += str(currentToken) + " "
            if currentToken.getType() == Token.INT:
                postfix.append(currentToken)
            elif currentToken.getType() == Token.LPAR:
                self._operatorStack.push(currentToken)
            elif currentToken.getType() == Token.RPAR:
                topOperator = self._operatorStack.pop()
                while topOperator.getType() != Token.LPAR:
                    postfix.append(topOperator)
                    topOperator = self._operatorStack.pop()
            else:
                while not self._operatorStack.isEmpty() and \
                      self._operatorStack.peek().getPrecedence() >= \
                      currentToken.getPrecedence():
                    postfix.append(self._operatorStack.pop())
                self._operatorStack.push(currentToken)
        while not self._operatorStack.isEmpty():
            postfix.append(self._operatorStack.pop())
        return postfix
   
    def __str__(self):
        """Returns a string containing the contents of the expression
        processed and the stack to this point."""
        result = "\n"
        if self._expressionSoFar == "":
            result += "Portion of expression processed: none\n"
        else: 
            result += "Portion of expression processed: " + \
                   self._expressionSoFar + "\n"
        if self._operatorStack.isEmpty():
            result += "The stack is empty"
        else:
            result += "Operators on the stack          : " + \
                      str(self._operatorStack)
        return result

    def translationStatus(self):
        return str(self)
Ejemplo n.º 4
0
class Translator(object):
    """Translates infix expressions to postfix expressions."""
    def __init__(self, scanner):
        """Sets the initial state of the translator."""
        self._expressionSoFar = ""
        self._operatorStack = LinkedStack()
        self._scanner = scanner

    def translate(self):
        """Returns a list of tokens that represent the postfix
        form of sourceStr.  Assumes that the infix expression
        in sourceStr is syntactically correct"""
        postfix = list()
        for currentToken in self._scanner:
            self._expressionSoFar += str(currentToken) + " "
            if currentToken.getType() == Token.INT:
                postfix.append(currentToken)
            elif currentToken.getType() == Token.LPAR:
                self._operatorStack.push(currentToken)
            elif currentToken.getType() == Token.RPAR:
                topOperator = self._operatorStack.pop()
                while topOperator.getType() != Token.LPAR:
                    postfix.append(topOperator)
                    topOperator = self._operatorStack.pop()
            else:
                while not self._operatorStack.isEmpty() and \
                      self._operatorStack.peek().getPrecedence() >= \
                      currentToken.getPrecedence():
                    postfix.append(self._operatorStack.pop())
                self._operatorStack.push(currentToken)
        while not self._operatorStack.isEmpty():
            postfix.append(self._operatorStack.pop())
        return postfix

    def __str__(self):
        """Returns a string containing the contents of the expression
        processed and the stack to this point."""
        result = "\n"
        if self._expressionSoFar == "":
            result += "Portion of expression processed: none\n"
        else:
            result += "Portion of expression processed: " + \
                   self._expressionSoFar + "\n"
        if self._operatorStack.isEmpty():
            result += "The stack is empty"
        else:
            result += "Operators on the stack          : " + \
                      str(self._operatorStack)
        return result

    def translationStatus(self):
        return str(self)
Ejemplo n.º 5
0
    def is_palindrome(self, word):
        # check if word is palindrome
        half_1, half_2 = word[:len(word) // 2], word[len(word) // 2:]

        # cut first letter, whcih is not important
        if len(half_2) != len(half_1):
            half_2 = half_2[1:]

        stack = LinkedStack()
        for let in half_1:
            stack.push(let)

        for i in range(len(half_2)):
            if half_2[i] != stack.peek():
                return 0
            stack.pop()

        return 1
Ejemplo n.º 6
0
 def lipeek_unit_test(self):
     temp = LinkedStack()
     for count in range(5):
           temp.push(count+1)
     self.assertEqual(temp.peek(), 5)