1 用数组建立一个固定大小的栈
append 实现push(); pop 实现pop()
class arraystack:
def __init__(self,size): # 开始怎么调都不成功,init 竟然写成了int
self.stackData=[]
self.len=size
def push(self,obj):
if len(self.stackData)==self.len:
raise Exception("The stack is full")
else:
self.stackData.append(obj)
def pop(self):
if len(self.stackData)==0:
raise Exception("The stack is empty")
else:
value=self.stackData.pop()
return value
def peek(self):
if len(self.stackData)==0:
raise Exception("The stack is empty")
else:
value=self.stackData[-1]
return value
2 用数组建立一个固定大小的队列
设置start 和end 指针控制队列的头尾,如果end和start 到size-1了(length=size),则跳回0位置
class arrayqueue:
def __init__(self,size):
self.queue=[]
self.lenn=size
self.end=0
self.start=0
length=0 #在def之外,是类变量
def push(self,obj):
if self.length==self.lenn:
raise Exception("The queue is full")
else:
self.length+=1
self.queue.append(obj)
self.end=self.nextIndex(self.lenn,self.end)
def poll(self):
if self.length==0:
raise Exception("The queue is empty")
else:
self.length-=1
return self.queue.pop(self.start)
self.start=self.nextIndex(self.lenn,self.start)
def nextIndex(self,size,size2):
return 0 if size2 == size-1 else size2+1
3 设计一个有getmin功能的栈
时间复杂度为O(1)
3.1 建立两个栈,连续压入最小值(若元素比当前min大,则min栈压入min栈的栈顶元素),弹出时一起弹出
class getmin1:
def __init__(self):
self.data=[]
self.minstack=[]
def push(self,obj):
self.data.append(obj)
if (len(self.minstack)==0)or obj<self.getmin():
self.minstack.append(obj)
else:
self.minstack.append(self.getmin())
def pop(self):
if len(self.minstack)==0:
raise Exception("The stack is empty")
self.minstack.pop()
return self.data.pop()
def getmin(self):
if len(self.minstack)==0:
raise Exception("The stack is empty")
else:
return self.minstack[-1]
3.2 只压入比当前栈顶更小或相等的值,返回的时候,如果min和data相等,则min栈也弹出,否则不弹
class getmin2:
def __init__(self):
self.data=[]
self.minstack=[]
def push(self,obj):
self.data.append(obj)
if (len(self.minstack)==0)or obj<=self.getmin():
self.minstack.append(obj)
def pop(self):
if len(self.minstack)==0:
raise Exception("The stack is empty")
value2=self.getmin()
value1=self.data.pop()
if value1==value2:
self.minstack.pop()
return value1
def getmin(self):
if len(self.minstack)==0:
raise Exception("The stack is empty")
else:
return self.minstack[-1]
4 用队列实现栈功能
用两个队列,pop时候,每次依次倒入另一个队列直到剩一个元素,则返回剩下的那个,然后交换这两个队列
class queue_stack:
def __init__(self):
self.queue=[]
self.helpp=[]
def push(self,obj):
self.queue.append(obj)
def pop(self):
while len(self.queue)!=1:
self.helpp.append(self.queue.pop(0))# pop(0)-取首元素
re=self.queue.pop()
self.queue,self.helpp=self.helpp,self.queue
return re
def peek(self):
while len(self.queue)!=1:
self.helpp.append(self.queue.pop(0))
re=self.queue.pop()
self.helpp.append(re)
self.queue,self.helpp=self.helpp,self.queue
return re
python转换的时候,a,b=b,a 则实现java/c的swap功能;pop(0)元素则删除并返回队首元素
5 用栈实现队列功能
用两个栈,stack负责push,helpp栈负责pop:每次从stack全部倒入help栈(help 栈为空时才能倒入,并且一次性全部倒入,不空时直接从辅助栈pop),然后从help栈里pop
class stack_queue:
def __init__(self):
self.stack=[]
self.helpp=[]
def push(self,obj):
self.stack.append(obj)
def pop(self):
if len(self.helpp)==0:
while len(self.stack)!=0:
self.helpp.append(self.stack.pop())
re=self.helpp.pop()
return re
def peek(self):
if len(self.helpp)==0:
while len(self.stack)!=0:
self.helpp.append(self.stack.pop())
re=self.helpp[-1]
return
6 用一个栈实现另一个栈的排序
不断将原栈栈顶元素弹出并向辅助栈压入:
若辅助栈为空或者辅助栈栈顶元素大于当前元素,则直接压入辅助栈;
若小于当前元素,则将辅助栈元素依次弹出并压入原栈,直到栈顶元素大于当前元素,然后将当前元素压入辅助栈。
得到的辅助栈排序从栈顶到栈底是升序排列的(栈顶是插入删除操作的一端),然后依次弹出压入原栈实现降序排列。
def sortstack(stack):
stack1=[]
while stack:
temp=stack.pop()
while stack1 and stack1[-1]<temp:
stack.append(stack1.pop())
stack1.append(temp)
while stack1:
stack.append(stack1.pop())
print(stack)
stack=[2,1,5,3,4]
sortstack(stack)
#[1, 2, 3, 4, 5]