【leetcode 225 】【队列实现栈】

leetcode 225【队列实现栈】

使用队列实现栈的下列操作:

push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空

题目链接

https://leetcode-cn.com/problems/implement-stack-using-queues/


解题思路与代码思路:

双队列法

利用辅助队列的方式,queue1用于存储栈内的元素,queue2作为入栈操作的辅助队列。 有元素入栈,就把队列一的元素存入队列二,新元素进入队列一,再把队列二的元素出队再入队队列一。可以把列表改成collections的deque,把pop方法改成popleft(),效率更高

单队列法

主要区别就是在入栈push操作那里。做法是记录队列本来的元素个数,然后先插入新元素,然后把n个旧元素出队并重新入队。其他操作依旧。


代码:

双队列法
class MyStack:
    def __init__(self):
        self.queue1 = []
        self.queue2 = []
    def push(self,x):
        self.queue2.append(x)
        while self.queue1:
            self.queue2.append(self.queue1.pop(0))
        self.queue1,self.queue2 = self.queue2,self.queue1
    def pop(self):
        return self.queue1.pop(0)
    def top(self):
        return self.queue1[0]
    def empty(self):
        return not self.queue1
单队列法
def __init__(self):
    self.queue = collections.deque()
def push(self,x):
    n = len(self.queue)
    self.queue.append(x)
    for _ in range(n):
        self.queue.append(self.queue.popleft())
def pop(self):
    return self.queue.popleft()        
def top(self):
    return self.queue[0]
def empty(self):
    return not self.queue  
        

复 杂 度 分 析 : \color{red}{复杂度分析:}
  1. 双队列法
  • 时间复杂度:入栈操作 O(n),其余操作都是 O(1)
    入栈需要将queue1中的n个元素出队并入队到queue2,共2n+1操作,出队入队操作的时间复杂度为O(1),所以入栈操作的复杂度是O(n);
    出栈是将queue1的前端元素出队,为O(1)
    返回栈顶元素也是O(1)
    判断是否为空只需要判断queue1是否为空,也是O(1)
  • 空间复杂度:O(N),n为栈内元素,用两个队列存栈内元素
  1. 单队列法
  • 时间复杂度:入栈操作 O(n),其余操作都是 O(1)
  • 空间复杂度:O(N)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值