栈与队列的几个题(固定大小的栈和队列,getmin功能的栈,栈实现队列,队列实现栈)

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 栈为空时倒入,并且一次性全部倒入),然后从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 

猜你喜欢

转载自blog.csdn.net/qq_43243022/article/details/85159402