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的视频教程,我仅用该博客作为复习笔记以及知识普及。