題目:
實作一個特殊的棧,在實作棧的基本功能的基礎上,再實作傳回棧中最小元素的操作
要求:
1、pop、push、getMin操作的時間複雜度都是O(1)
2、設計的棧類型可以使用現成的棧結構
解決辦法:
使用兩個棧,一個棧用來儲存目前棧中的元素,其功能和一個正常的棧沒有差別,這個棧記為stackData; 另一個棧用于儲存每一步的最小值,這個棧記為stackMin。具體實作方式如下:
1 同步壓入 1
2 重複壓入 1 1
1 同步壓入 1
5 重複壓入3 3
4 重複壓入3 3
3 同步壓入 3
stackData stackMin
class Stack():
def __init__(self):
self.item = []
def pop(self):
if len(self.item)==0:
return "the Stack is empty"
else:
self.item.pop()
def push(self,item):
self.item.append(item)
def peek(self):
return self.item[len(self.item)-1]
class MyStack():
def __init__(self):
self.stackData = Stack()
self.stackMin = Stack()
def push(self,num):
if len(self.stackMin.item) == 0:
self.stackMin.push(num)
elif num < self.getmin():
self.stackMin.push(num)
else:
newnum = self.stackMin.peek()
self.stackMin.push(newnum)
self.stackData.push(num)
def pop(self):
if len(self.stackData.item)==0:
return "the stackData is empty"
self.stackMin.item.pop()
return self.stackData.item.pop()
def getmin(self):
if len(self.stackMin.item) == 0:
return "the stackMin is empty"
return self.stackMin.peek()
s =MyStack()
s.push(3)
s.push(4)
s.push(5)
s.push(1)
s.push(2)
s.push(1)
s.stackData.item
s.stackMin.item