参照《大话数据结构》一书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()
以上,欢迎交流指正!