首先自己用 节点 实现了 栈 这种数据类型
为了实现题目了要求,我使用的两个栈。
一个栈 用来 push pop 用户的数据, 另外一个栈用来存放 最小元素(涉及元素比较)
代码如下:
1 #!/usr/bin/env python3 2 3 class Node(object): 4 def __init__(self, elem, next_=None): 5 self.elem = elem 6 self.next = next_ 7 8 class LStack(object): 9 def __init__(self): 10 self.top = None 11 12 def is_empty(self): 13 return self.top is None 14 15 def push(self, elem): 16 self.top = Node(elem, self.top) 17 18 def pop(self): 19 if self.is_empty(): 20 raise ValueError("Stack is Empty") 21 e = self.top.elem 22 self.top = self.top.next 23 return e 24 25 def peek(self): 26 if self.is_empty(): 27 raise ValueError("Stack is Empty") 28 return self.top.elem 29 30 class Stack_Find_Min(object): 31 def __init__(self): 32 self.s1 = LStack() 33 self.s2 = LStack() 34 self.minvalue = 0 35 36 def is_empty(self): 37 return self.s1.is_empty() 38 39 def push(self, elem): 40 self.s1.push(elem) 41 if self.s2.is_empty(): 42 self.s2.push(elem) 43 self.minvalue = elem 44 elif elem < self.minvalue: 45 self.s2.push(elem) 46 self.minvalue = elem 47 48 def pop(self): 49 if self.s1.is_empty(): 50 raise ValueError("Stack is Empty") 51 e = self.s1.pop() 52 if e == self.minvalue: 53 self.s2.pop() 54 self.minvalue = self.s2.peek() 55 return e 56 57 def peek(self): 58 return self.s1.peek() 59 60 def minx(self): 61 return self.s2.peek() 62 63 if __name__=="__main__": 64 sm = Stack_Find_Min() 65 for i in [3,2,7,9,4,6,8,1]: 66 sm.push(i) 67 print("minx:",sm.minx()) 68 print("pop:",sm.pop()) 69 print("minx:",sm.minx())