Day8 stackの続き

class InfixToPostfix(object):
    """
    InfixToPostfix つまり中置から後置
    get the postfix of the given infix expression
    """

    def __init__(self, expression=None, stack=None):
        """
        :param expression: the infix expression to be converted to postfix
        :param stack: stack to perform infix to postfix operation
        """
        self.expression = list(expression)
        self.my_stack = stack

    @staticmethod
    def _is_operand(char):
        """
        utility function to find whether the given character is an operator
        """
        # OLD VERSION
        # return ord(char) >= ord('a') and ord(char) <= ord('z') \
        #        or ord(char) >= ord('A') and ord(char) <= ord('Z')
        return True if ord(char) in [ord(c) for c in ascii_letters] else False

    @staticmethod
    def _precedence(char):
        """
        utility function to find precedence of the specified character
        """
        if char == '+' or char == '-':
            return 1
        elif char == '*' or char == '/':
            return 2
        elif char == '^':
            return 3
        else:
            return -1

    def infix_to_postfix(self):
        """
        function to generate postfix expression from infix expression
        """
        postfix = []

        for i in range(len(self.expression)):
            if self._is_operand(self.expression[i]):
                postfix.append(self.expression[i])
            elif self.expression[i] == '(':
                self.my_stack.push(self.expression[i])
            elif self.expression[i] == ')':
                top_operator = self.my_stack.pop()
                while not self.my_stack.is_empty() and top_operator != '(':
                    postfix.append(top_operator)
                    top_operator = self.my_stack.pop()
            else:
                while not self.my_stack.is_empty() and self._precedence(self.expression[i]) <= self._precedence(
                        self.my_stack.peek()):
                    postfix.append(self.my_stack.pop())
                self.my_stack.push(self.expression[i])

        while not self.my_stack.is_empty():
            postfix.append(self.my_stack.pop())
        return ' '.join(postfix)

    @staticmethod
    def get_code():
        """
        returns the code of the current class
        """
        return inspect.getsource(InfixToPostfix)

・return True if ord(char) in [ord(c) for c in ascii_letters] else False
この書き方を初めて知った。

・ord()............ord()とはPythonの組み込み関数。1文字のユニコード文字を表す文字列に対し、その文字のユニコードポイントを表す整数を返す。この反対がchr()らしい。

ユニコードポイントとは、世界中の文字にポイントが割り当てられていて、この割り振られている番号のこと。


今日も昨日と同じです。ありがとうございます!
pygorithm/stack.py at master · OmkarPathak/pygorithm · GitHub