1.题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如:序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
class Solution():
def compare(self,pushv,popv):
stack =[]
index = 0
if pushv == [] or len(pushv)!= len(popv):
return None
for i in pushv:
stack.append(i)
#注意:当stack列表为空时,stack[-1]会出问题
while stack and stack[-1] == popv[index]:
stack.pop()
index += 1
#当popv是pushv的弹出队列时,stack列表中元素被全部弹出
if len(stack)== 0:
return True
else:
return False
if __name__== "__main__":
x = Solution()
pushv = [1,2,3,4,5]
popv = [4,3,5,2,1]
a = x.compare(pushv,popv)
print(a)
2.定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))
思路:由于时间复杂度为O(1),则用空间换时间。
class Solution():
def __init__(self):
self.stack = []
#建立一个新的列表,用于储存当前最小元素
self.minval = []
def push(self,item):
self.stack.append(item)
if self.minval:
#如果新列表中末尾值大于入栈的值,则用入栈的值替换
if self.minval[-1] > item:
self.minval.append(item)
#否则继续在相应位置保留当前最小值
else:
self.minval.append(self.minval[-1])
else:
self.minval.append(item)
def pop(self):
#考虑栈为空
if self.stack == None:
return None
self.stack.pop()
self.minval.pop()
def top(self):
#考虑栈为空
if self.stack == None:
return None
return self.stack[-1]
def min(self):
#考虑栈为空
if self.minval == None:
return None
return self.minval[-1]
if __name__ == "__main__":
s = Solution()
s.push(5)
s.push(2)
s.push(4)
s.push(7)
s.push(3)
min = s.min()
print(min)
输出结果:
注:非常感谢B站中各位大神分享的剑指offer的视频教程,我仅用该博客作为复习笔记以及知识普及。