def infix_to_suffix(expr):
    """ 从中序表达式到后序表达式的转换 """
    stack, suffixes, operators = Stack(), [], {
        '*': 3,
        '/': 3,
        '+': 2,
        '-': 2,
        '(': 1,
        ')': 1,
    }

    for i in list(expr.replace(' ', '')):
        if i.upper() in string.ascii_uppercase:
            suffixes.append(i)
        elif i == '(':
            stack.push(i)
        elif i == ')':
            top = stack.pop()
            while top != '(':
                suffixes.append(top)
                top = stack.pop()
        else:
            while not stack.isEmpty() and operators[
                    stack.peek()] >= operators[i]:
                suffixes.append(stack.pop())
            stack.push(i)

    while not stack.isEmpty():
        suffixes.append(stack.pop())

    return ''.join(suffixes)
Exemple #2
0
class StackTestCase(unittest.TestCase):
    """ 测试 stack.py """
    def setUp(self) -> None:
        self.stack = Stack()

    def testStackIsEmpty(self) -> None:
        self.assertTrue(self.stack.isEmpty())

        self.stack.push(1)
        self.assertFalse(self.stack.isEmpty())

    def testStackPush(self) -> None:
        self.stack.push(1)
        self.assertEqual([1], self.stack.items)

        self.stack.push('a')
        self.assertEqual([1, 'a'], self.stack.items)

        self.stack.push(False)
        self.assertEqual([1, 'a', False], self.stack.items)

    def testStackPop(self):
        self.stack.push(1)
        self.stack.push('a')
        self.stack.push(False)
        self.stack.push(None)

        self.stack.pop()
        self.assertEqual([1, 'a', False], self.stack.items)

        self.stack.pop()
        self.assertEqual([1, 'a'], self.stack.items)

        self.stack.pop()
        self.assertEqual([1], self.stack.items)

        self.stack.pop()
        self.assertEqual([], self.stack.items)

    def testStackPeek(self) -> None:
        self.stack.push(1)
        self.assertEqual(1, self.stack.peek())

        self.stack.push('a')
        self.assertEqual('a', self.stack.peek())

        self.stack.push(True)
        self.assertEqual(True, self.stack.peek())

        self.stack.push(None)
        self.assertEqual(None, self.stack.peek())

    def testStackSize(self) -> None:
        self.stack.push(99)
        self.assertEqual(1, self.stack.size())

        self.stack.push('A')
        self.assertEqual(2, self.stack.size())

        self.stack.push(True)
        self.assertEqual(3, self.stack.size())

        self.stack.push(None)
        self.assertEqual(4, self.stack.size())

    def tearDown(self) -> None:
        del self.stack