Python利用栈将中缀表达式转换为后缀表达式(四则运算)

参照《大话数据结构》一书4.9节,基于Python实现了中缀表达式到后缀表达式的转换。
栈的实现使用顺序结构,即基于列表实现,与本人博客Python实现顺序结构栈Sequence Stack一致。

class SeqStack(object):
    def __init__(self, size=10):
        self.__MAXSIZE = size  # 将MAXSIZE定义为私有变量,禁止子类对象访问
        self.__data = [' '] * size  # 将data定义为私有变量,禁止子类对象访问
        self.__top = -1  # 栈为空时top=-1,将top定义为私有变量,禁止子类对象访问

    def __str__(self):
        return ' '.join([str(self.__data[i]) for i in range(self.__top + 1)])

    def push(self, value):
        if self.__top + 1 >= self.__MAXSIZE:
            raise OverflowError('当前栈已满(%s),无法存入数据!' % str(self))
            return False
        self.__top += 1
        self.__data[self.__top] = value
        return True

    def push_many(self, values):
        if not values:
            raise ValueError('请传入数据!')
        if type(values) != list:
            raise TypeError('请传入列表!')
        for v in values:
            self.push(v)

    def pop(self):
        if self.__top == -1:
            raise OverflowError('当前栈已空,无法取出数据!')
        value = self.__data[self.__top]
        self.__data[self.__top] = None  # 删除原有数据
        self.__top -= 1
        return value

    def top(self):
        if self.__top == -1:
            return None  # 栈为空时返回None
        return self.__data[self.__top]

    def __len__(self):
        return self.__top + 1


def transform(infix):
    suffix = ''
    nums = '0123456789'
    signs = '+-*/'
    symbol = SeqStack()
    for c in infix:
        # 数字直接输出
        if c in nums:
            if suffix and suffix[-1] in signs:
                suffix += ' '
            suffix += c
        # 左括号直接入栈
        elif c == '(':
            symbol.push(c)
        # 遇到右括号,弹出栈内符号直至弹出左括号
        elif c == ')':
            top = symbol.pop()
            while top != '(':
                suffix += ' ' + top
                top = symbol.pop()
        # 遇到+-号,弹出栈内符号,直至遇到左括号
        elif c == '+' or c == '-':
            # 栈不为空且栈顶符号不是左括号
            while symbol and symbol.top() != '(':
                top = symbol.pop()
                suffix += ' ' + top
            symbol.push(c)  # 将当前符号入栈
            suffix += ' '
        # 遇到*/号直接入栈
        elif c == '*' or c == '/':
            symbol.push(c)            
            suffix += ' '
    # 将未出栈的运算符添加到末尾
    while symbol:
        top = symbol.pop()
        if top != '(':
            suffix += ' ' + top
    suffix.replace('  ', ' ')
    return suffix

def main():
    infix = '1+((2+3)*4)-5'
    suffix = transform(infix)
    print(suffix)


if __name__ == '__main__':
    main()

以上,欢迎交流指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值