构造一个特殊栈,实现方法getmin,返回栈中的最小元素 Python版
2017-12-22 23:22
826 查看
题目:
构造一个栈结构,其中需要实现一个方法,该方法 getmin,返回栈中的最小的元素。
要求:
时间复杂度为o(1)。
分析:
之前我写过了用python写一个栈数据结构,代码在这里:
队列和栈的Python实现
在这里,需要以时间复杂度 o(1)完成查找,也就是说,必须以空间换时间。因此,构造一个栈,这个栈的栈顶必须保持始终都是原始栈的最小值。在原始栈插入和弹出元素时,这个辅助栈必须跟着配合,保持最小值。具体操作不细述了,看代码里即可。
代码:
构造一个栈结构,其中需要实现一个方法,该方法 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
相关文章推荐
- 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
- 一、实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
- 设计一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
- 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的
- 011实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,时间复杂度都为O(1)(keep it up)
- 算法2_实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,时间复杂度都为O(1)(keep it up)
- Chapter 3 | Stacks and Queues--实现一个函数返回栈中的最小值,时间复杂度为O(1)
- JavaScript数组对象实现增加一个返回随机元素的方法
- cc150:实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值。
- 每日一道算法题2——定义一个栈,提供一个返回栈里最小元素方法
- JavaScript数组对象实现增加一个返回随机元素的方法
- Python实现返回数组中第i小元素的方法示例
- python 试题:请写一个类,实现一个stack类,要求类中包含至少一个特殊方法。
- Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
- 实现一个可以返回其所存储的最小元素的栈
- 实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,
- 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返 回栈中最小元素的操作。
- 实现一个容器,每次调用select()方法时,随机返回一个元素
- 编写js扩展方法实现判断一个数组中是否包含某个元素
- 多元素判断的程序的一个简单实现方法