您的位置:首页 > 编程语言 > Python开发

构造一个特殊栈,实现方法getmin,返回栈中的最小元素 Python版

2017-12-22 23:22 826 查看
题目

构造一个栈结构,其中需要实现一个方法,该方法 getmin,返回栈中的最小的元素。

要求

时间复杂度为o(1)。

分析

之前我写过了用python写一个栈数据结构,代码在这里:

队列和栈的Python实现

在这里,需要以时间复杂度 o(1)完成查找,也就是说,必须以空间换时间。因此,构造一个栈,这个栈的栈顶必须保持始终都是原始栈的最小值。在原始栈插入和弹出元素时,这个辅助栈必须跟着配合,保持最小值。具体操作不细述了,看代码里即可。

代码

class Node(object):
# 栈结点
def __init__(self, value, next=0):
self.value = value
self.next = next  # 指针

class SpecialStack(object):
def __init__(self):
self.head = 0
self.stackmin = []

def init_stack(self, data):
self.head = Node(data[0])
if self.stackmin =[]:
self.stackmin.append(data[0])
p = self.head
for i in data[1:]:
p.next = Node(i)
pop = self.stackmin.pop()
if pop >= i:
self.stackmin.append(pop)
self.stackmin.append(i)
else:
self.stackmin.append(pop)
p = p.next

def clear_stack(self):
self.head = 0
self.stackmin = []

def is_empty(self):
if self.head == 0:
return True
else:
return False

def get_length(self):
p, length = self.head, 0
while p != 0:
length += 1
p = p.next
return length

def push(self, value):  # 向栈中添加一个结点
if self.is_empty():
self.head = Node(value)
else:
p = self.head
for _ in xrange(self.get_length() - 1):
p = p.next
p.next = Node(value)
pop = self.stackmin.pop()
if pop >= value:
self.stackmin.append(pop)
self.stackmin.append(value)
else:
self.stackmin.append(pop)

def get_top(self):  # 获得栈顶元素
if self.is_empty():
print 'This is an empty stack.'
return
else:
p = self.head
for _ in xrange(self.get_length()):
p = p.next
return p.value

def pop(self):  # 弹出栈顶元素
length = self.get_length()
if self.is_empty():
print 'This is an empty stack.'
return
elif length == 1:
p = self.head
self.head = 0
self.stackmin = []
return p.value
elif length == 2:
p = self.head
value = p.next.value
self.head.next = 0
if len(self.stackmin) == 2:
self.stackmin.pop()
return value
else:
p = self.head
for _ in xrange(1, length - 1):
p = p.next
pop = p.next
p.next = 0
stack_min = self.stackmin.pop()
if stack_min < pop.value:
self.stackmin.append(stack_min)
return pop.value

def show_stack(self):  # 打印栈中的所有元素
if self.is_empty():
print 'This is an empty stack.'
else:
p, container = self.head, []
for _ in xrange(self.get_length() - 1):
container.append(p.value)
p = p.next
container.append(p.value)
print container

def get_min(self):
'''
返回链栈中的最小的元素的值,要求时间复杂度为 o(1),主要方法是用空间换时间,构建一个存放最小栈元素的栈 stackmin。
每次向栈中添加元素的时候,都判断这个元素是不是比栈中的元素小,如果是相等或更小,则将该数放在 stackmin 中。
每次弹出一个栈顶元素,判断该数是不是比 stackmin的栈顶元素大,如果大,则 stackmin不需要任何操作。
在查询时,直接返回stackmin的栈顶元素即可。
'''
pop = self.stackmin.pop()
self.stackmin.append(pop)
return pop
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据结构
相关文章推荐