定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
用python实现栈的话很简单,因为python本身的list其实就和栈高度相似,而且还可以比栈更简单。这里要注意的是top是指找到栈顶元素的指针。不能pop要用[-1]
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack = []
def push(self, node):
self.stack.append(node)
# write code here
def pop(self):
return self.stack.pop()
# write code here
def top(self):
return self.stack[-1]
# write code here
def min(self):
return min(self.stack)
# write code here
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
分析:
第一个关键点是不知道栈的大小,所以有高有低,也不知道栈的多少。
第二个关键点是出栈和入栈的特点,只知道压入顺序,说明:一开始是1,2,3,4,5的顺序进入的。
第三个关键点是弹出序列,由于不知道栈的高低,所以也不知道具体是哪一种。但是可以根据这个东西知道我们栈的高低是多少。
比如给出的是4,5,3,2,1
那么我们先创建一个副栈,来模拟实际栈的高低,按照压入顺序入栈,直到和弹出的顺序首位相等,那么说明了已经满了,这时候的栈。比如这里入副栈到4的话已经满了。这时候两个都弹出,因为如果还要入栈5的话,4就必须离开。这时候五进入。然后这个就是最终的出栈顺序了。这个和刚刚的已经弹出了第一个进行比较就可以知道符不符合了。因为这时候的副栈弹出顺序一定是等同于弹出顺序的,不然就是有问题的东西。
解决问题的关键是了解好入栈和出栈的特点即可。
class Solution:
def IsPopOrder(self, pushV, popV):
sub_stack = []
while pushV:
if pushV[0] != popV[0]:
sub_stack.append(pushV.pop(0))
else:
pushV.pop(0)
popV.pop(0)
sub_stack.reverse()
if sub_stack == popV:
return True
else:
return False