刷题记录3——用栈实现队列

发布于:2022-10-15 ⋅ 阅读:(313) ⋅ 点赞:(0)

题目:

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例 1:

输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]

示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

提示:

    1 <= values <= 10000
    最多会对 appendTail、deleteHead 进行 10000 次调用

思考:

队列是先入先出

栈是先入后出

题目中说的是实现队列的方法,要求的也是在队尾插入,在队头删除

可以设计两个栈

一个栈用来加入

另一个栈对A进行倒序,最终pop

或者直接pop(0),既然题目中要求的是两个栈那就再设置一个反转的栈吧

在python 中实现入栈和出栈比较方便的就是列表的反转和pop,例如

list2 = list1[::-1]

list1.pop()

题目中的意思大概为appendTail方法不输出,deleteHead方法中,如果列表有内容则返回开头的内容,没有内容则返回-1

解决方案:

class CQueue(object):

    def __init__(self):
        self.list1 = []
        self.list2 = []

    def appendTail(self, value):
        """
        :type value: int
        :rtype: None
        """
        self.list1.append(value)


    def deleteHead(self):
        """
        :rtype: int
        """
        self.list2 = self.list1[::-1]
        if self.list2 :
            self.list1.pop(0)
            del_num = self.list2.pop()
            return del_num
            
        else :
            return -1

需要注意的就是别忘了对list1进行pop(0),不然的话list1就没有改变,最后导致一直没有出栈

执行用时:1352 ms, 在所有 Python 提交中击败了39.53% 的用户

内存消耗:17.7 MB, 在所有 Python 提交中击败了6.62% 的用户

通过测试用例:55 / 55

标准答案

class CQueue:
    def __init__(self):
        self.A, self.B = [], []

    def appendTail(self, value: int) -> None:
        self.A.append(value)

    def deleteHead(self) -> int:
        if self.B: return self.B.pop()
        if not self.A: return -1
        while self.A:
            self.B.append(self.A.pop())
        return self.B.pop()

函数设计:

    加入队尾 appendTail() : 将数字 val 加入栈 A 即可。
    删除队首deleteHead() : 有以下三种情况。
        当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。
        否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。
        否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。

标准答案相对于我写的函数而言,更加可以体现入栈出栈和倒序的思想


网站公告

今日签到

点亮在社区的每一天
去签到