栈和队列 232. 用栈实现队列 225.用队列实现栈 155. 最小栈

232. 用栈实现队列

  • 使用栈实现队列的下列操作:
    • push(x) – 将一个元素放入队列的尾部。
    • pop() – 从队列首部移除元素。
    • peek() – 返回队列首部的元素。
    • empty() – 返回队列是否为空。

思路:

栈为后进先出(LIFO),因此栈的pop()方法和top()方法都是针对栈顶元素,即append()的最后一个元素。
而队列的pop()方法和peek()方法是针对队列首部元素,即append()的第一个元素。
因此在用栈实现队列的pop()方法和peek()方法时,需要将输入栈元素依次出栈压入输出栈,实现元素反转,再使用栈的pop()方法。

利用两个堆栈,一个叫输入栈,一个叫输出栈。用于实现进入队列Push(x),出队列pop(),查看最后一个元素peek(),及判断是否为空empty()函数。每次从输入栈进,输出栈出。
push操作:将加入的元素添加到输入栈;
pop操作:从输出栈取走元素,输出栈没有元素时,将输入栈元素依次出栈压入输出栈,再从输出栈取出;
peek操作:访问输出栈栈顶元素,输出栈没有元素时,将输入栈元素依次出栈压入输出栈,再从输出栈取出;
empty为真的条件:两个栈都为空。

代码实现

class MyQueue:
    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.stackin = []
        self.stackout = []

    def push(self, x: int) -> None:
        """
        Push element x to the back of queue.
        """
        self.stackin.append(x)

    def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        if len(self.stackout) == 0:
            while self.stackin:
                self.stackout.append(self.stackin.pop())

        return self.stackout.pop()

    def peek(self) -> int:
        """
        Get the front element.
        """
        if len(self.stackout) == 0:
            while self.stackin:
                self.stackout.append(self.stackin.pop())

        return self.stackout[-1]

    def empty(self) -> bool:
        """
        Returns whether the queue is empty.
        """
        if self.stackin or self.stackout:
            return False
        else:
            return True

225. 用队列实现栈

  • 使用队列实现栈的下列操作:
    • push(x) – 元素 x 入栈
    • pop() – 移除栈顶元素
    • top() – 获取栈顶元素
    • empty() – 返回栈是否为空

思路:

队列为先进先出(FIFO),要用队列实现栈,只需要在向栈中插入数据时,实现反转,即可使用队列的pop(0)方法。
使用一个队列,队列添加元素后,反转前n-1个元素,栈顶元素始终保留在队首

代码实现

class MyStack:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.q = []


    def push(self, x: int) -> None:
        """
        Push element x onto stack.
        """
        self.q.append(x)
        n = len(self.q)
        while n > 1:
            self.q.append(self.q.pop(0))
            n -= 1
        
        
    def pop(self) -> int:
        """
        Removes the element on top of the stack and returns that element.
        """
        return self.q.pop(0)


    def top(self) -> int:
        """
        Get the top element.
        """
        return self.q[0]


    def empty(self) -> bool:
        """
        Returns whether the stack is empty.
        """
        return not self.q



# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

155. 最小栈

  • 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
    • push(x) – 将元素 x 推入栈中。
    • pop() – 删除栈顶的元素。
    • top() – 获取栈顶元素。
    • getMin() – 检索栈中的最小元素。

思路:

  1. 对push增加功能:每次push比较一次,看当前值是否为新的最小值
  2. 对pop增加功能:每次pop操作,判断弹出的是否是最小值所在位置,是的话重新寻找最小值,时间复杂度 O ( n ) O(n) O(n)
  3. 由2,需要自定义一个寻找最小值的函数。

push: O(1)时间, O(1)空间
pop: O(n)时间, O(1)空间
getMin和top:O(1)时间啦

代码实现

class MinStack:
    def __init__(self):
        """
        initialize your data structure here.
        """
        self.__list = []
        # 定义最小值索引
        self.minindex = 0

    def push(self, x: int) -> None:
        self.__list.append(x)
        # 判断新加入的值是否比原有最小值小,若成立,则修改最小值索引为 列表长度-1
        if self.__list[self.minindex] > x:
            self.minindex = len(self.__list) - 1

    def pop(self) -> None:
    	# 设置最小值标志,若弹出的值为最小值,则重新寻找最小值
        Flag = False
        if self.minindex == len(self.__list) - 1:
            Flag = True
        if Flag:
        	# 栈顶为最小值,先弹出,再重新寻找最小值
            num = self.__list.pop()
            self.arrange()
        else:
        	# 栈顶不为最小值,直接弹出
            num = self.__list.pop()
        return num

    def top(self) -> int:
        return self.__list[-1]

    def getMin(self) -> int:
        if self.__list == []:
            return None
        return self.__list[self.minindex]

    def arrange(self):
    	# 寻找最小值函数
        n = len(self.__list)
        minindex = 0
        for i in range(1, n):
            if self.__list[i] < self.__list[minindex]:
                minindex = i
        self.minindex = minindex
        
        
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值