用list
来实现栈,栈的top
元素为list[-1]
,base
元素为list[0]
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
# 判断是否为空
return self.items == []
def push(self, item):
# 压入一个元素,无返回值
self.items.append(item)
def pop(self):
# 弹出一个元素
return self.items.pop()
def peek(self):
# 返回top元素,不改变原Stack
return self.items[len(self.items) - 1]
def size(self):
# 返回Stack的大小
return len(self.items)
等同于使用下面的语句
from pythonds.basic import Stack
在使用前,需要安装pythonds
,也就是pip install pythonds
调用:
s=Stack()
print(s.isEmpty())
s.push(4)
s.push('dog')
print(s.peek())
s.push(True)
print(s.size())
print(s.isEmpty())
s.push(8.4)
print(s.pop())
print(s.pop())
print(s.size())
True
dog
3
False
8.4
True
2
如果假设,栈的base
元素为list[-1]
,top
元素为list[0]
,代码如下
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
# 判断是否为空
return self.items == []
def push(self, item):
# 压入一个元素,无返回值
self.items.insert(0, item)
def pop(self):
# 弹出一个元素
return self.items.pop(0)
def peek(self):
# 返回top元素,不改变原Stack
return self.items[0]
def size(self):
# 返回Stack的大小
return len(self.items)
注意:
选择list[0]
作为top
还是base
,在时间复杂度上有着截然不同的区别。因为list
的append
和pop()
操作都只需要
O
(
1
)
O(1)
O(1) 的时间复杂度,但insert(0)
和pop(0)
都需要
O
(
n
)
O(n)
O(n) 的复杂度。
应用:
用栈反转字符串
from test import testEqual
from pythonds.basic import Stack
'''代码实现的功能同下面的函数一样
def revstring(mystr):
s=Stack()
for i in mystr:
s.push(i)
lt=[]
for i in range(len(mystr)):
lt.append(s.pop())
return ''.join(lt)
'''
def revstring(mystr):
s=Stack()
for i in mystr:
s.push(i)
revstr=''
while not s.isEmpty():
revstr=revstr+s.pop()
return revstr
testEqual(revstring('apple'),'elppa')
testEqual(revstring('x'),'x')
testEqual(revstring('1234567890'),'0987654321')
Pass
Pass
Pass
参考:
https://runestone.academy/runestone/static/pythonds/BasicDS/ImplementingaStackinPython.html
https://stackoverflow.com/questions/39859834/how-can-i-install-pythonds-module
python 列表的时间复杂度