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
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
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)
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
def lipeek_unit_test(self): temp = LinkedStack() for count in range(5): temp.push(count+1) self.assertEqual(temp.peek(), 5)