美文网首页
python实现逆波兰计算表达式的代码

python实现逆波兰计算表达式的代码

作者: we1212 | 来源:发表于2021-11-12 13:20 被阅读0次

    如下资料是关于python实现逆波兰计算表达式的代码。

    symbol_priority = {}

    symbol_priority[0] = ['#']

    symbol_priority[1] = ['(']

    symbol_priority[2] = ['+', '-']

    symbol_priority[4] = [')']

    def comparePriority(symbol, RPN_stack, symbol_stack):

        '''Compare priority between two symbols'''

        global symbol_priority

        if len(symbol_stack) > 0:

            symbol_pop = symbol_stack.pop()

        else:

            return

        for list in symbol_priority.values():

            if (symbol in list) and (symbol_pop in list):

                '''same priority'''

                symbol_stack.append(symbol_pop)

                symbol_stack.append(symbol)

                return

            elif symbol in list:

                '''symbol is smaller'''

                RPN_stack.append(symbol_pop)

                #recusion call

                comparePriority(symbol, RPN_stack, symbol_stack)

                return

            elif symbol_pop in list:

                '''symbol is bigger'''

                symbol_stack.append(symbol_pop)

                symbol_stack.append(symbol)

                return

            else:

                continue

            symbol_stack.append(symbol_pop)

            return

    def scanEveryone(input_string, RPN_stack, symbol_stack):

        for ch in input_string:

            if ch.isdigit():

                RPN_stack.append(ch)

            else:

                if len(symbol_stack) > 0:

                    if ch == '(':

                        symbol_stack.append(ch)

                    elif ch == ')':

                        while True:

                            symbol_pop = symbol_stack.pop()

                            if symbol_pop == '(':

                                break

                            else:

                                RPN_stack.append(symbol_pop)

                    else:

                        comparePriority(ch, RPN_stack, symbol_stack)

                else:

                    symbol_stack.append(ch)

    def scanInput(RPN_stack, symbol_stack):

        input_string = raw_input()

        input_string += '#'

        scanEveryone(input_string, RPN_stack, symbol_stack)

    def calRPN(RPN_stack):

        value_stack = []

        RPN_stack.append('#')

        for value in RPN_stack:

            if value == '#':

                return value_stack.pop()

                break

            if value.isdigit():

                value_stack.append(value)

            else:

                right_value = value_stack.pop()

                left_value = value_stack.pop()

                cal_string = left_value + value + right_value

                value_stack.append(str(eval(cal_string)))

    def main():

        RPN_stack = []

        symbol_stack = []

        scanInput(RPN_stack, symbol_stack)

        print calRPN(RPN_stack)

    if __name__ == '__main__':

        main()

                                   

                           

                                   

    calRPN.py

                                   

                           

                                   

    symbol_priority = {}

    symbol_priority[0] = ['#']

    symbol_priority[1] = ['(']

    symbol_priority[2] = ['+', '-']

    symbol_priority[4] = [')']

    def comparePriority(symbol, RPN_stack, symbol_stack):

        '''Compare priority between two symbols'''

        global symbol_priority

        if len(symbol_stack) > 0:

            symbol_pop = symbol_stack.pop()

        else:

            return

        for list in symbol_priority.values():

            if (symbol in list) and (symbol_pop in list):

                '''same priority'''

                symbol_stack.append(symbol_pop)

                symbol_stack.append(symbol)

                return

            elif symbol in list:

                '''symbol is smaller'''

                RPN_stack.append(symbol_pop)

                #recusion call

                comparePriority(symbol, RPN_stack, symbol_stack)

                return

            elif symbol_pop in list:

                '''symbol is bigger'''

                symbol_stack.append(symbol_pop)

                symbol_stack.append(symbol)

                return

            else:

                continue

            symbol_stack.append(symbol_pop)

            return

    def scanEveryone(input_string, RPN_stack, symbol_stack):

        for ch in input_string:

            if ch.isdigit():

                RPN_stack.append(ch)

            else:

                if len(symbol_stack) > 0:

                    if ch == '(':

                        symbol_stack.append(ch)

                    elif ch == ')':

                        while True:

                            symbol_pop = symbol_stack.pop()

                            if symbol_pop == '(':

                                break

                            else:

                                RPN_stack.append(symbol_pop)

                    else:

                        comparePriority(ch, RPN_stack, symbol_stack)

                else:

                    symbol_stack.append(ch)

    def scanInput(RPN_stack, symbol_stack):

        input_string = raw_input()

        input_string += '#'

        scanEveryone(input_string, RPN_stack, symbol_stack)

    def calRPN(RPN_stack):

        value_stack = []

        RPN_stack.append('#')

        for value in RPN_stack:

            if value == '#':

                return value_stack.pop()

                break

            if value.isdigit():

                value_stack.append(value)

            else:

                right_value = value_stack.pop()

                left_value = value_stack.pop()

                cal_string = left_value + value + right_value

                value_stack.append(str(eval(cal_string)))

    def main():

        RPN_stack = []

        symbol_stack = []

        scanInput(RPN_stack, symbol_stack)

        print calRPN(RPN_stack)

    if __name__ == '__main__':

        main()

                                   

                           

                   

                   

               

               

                   

    相关文章

      网友评论

          本文标题:python实现逆波兰计算表达式的代码

          本文链接:https://www.haomeiwen.com/subject/ayxozltx.html