算法打卡day09

今日任务:

1)232.用栈实现队列

2)225.用队列实现栈

232.用栈实现队列

题目链接:232. 用栈实现队列 - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列哔哩哔哩bilibili

思路:

比较简单,没什么好说,就是用两个栈控制,当要pop或者top时,就把进栈中的数pop出来,用另一个存起来,这样栈中的数就反转了

当要模仿队列FIFO时,1先2后。所以pop时因该先出1,后出2。而栈中是先进后出,反过来了,所以当要pop时,我们那利用第二个栈将数反过来即可

class MyQueue:

    def __init__(self):
        self.stack_in = []
        self.stack_out = []


    def push(self, x: int) -> None:
        self.stack_in.append(x)

    def pop(self) -> int:
        if self.stack_out == []:
            while self.stack_in:
                self.stack_out.append(self.stack_in.pop())
        return self.stack_out.pop()

    def peek(self) -> int:
        tmp = self.pop()
        self.stack_out.append(tmp)

        return tmp


    def empty(self) -> bool:
        return True if self.stack_out==[] and self.stack_in==[] else False

225.用队列实现栈

题目链接:225. 用队列实现栈 - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈哔哩哔哩bilibili

思路:

用python的deque中pop与栈的功能一样,简直就是作弊哈哈哈哈,这里也不写了

如果要严格按队列先进先出,那换成popleft来做

法一:

思想比较简单,添加元素存放在队列中,当要提出或者展示第一个元素时,栈是返回最后进入的元素,而队列是返回最先进入的元素,所以,当要提出或者展示第一个元素时,我们先把队列中前面的元素用另一个队列存起来,只留最后一个元素返回即可

from collections import deque


class MyStack:

    def __init__(self):
        self.queue1 = deque()
        self.queue2 = deque()

    def push(self, x: int) -> None:
        self.queue1.append(x)

    def pop(self) -> int:
        if self.empty():
            return None

        while len(self.queue1) > 1:
            self.queue2.append(self.queue1.popleft())
        tmp = self.queue1.popleft()

        self.queue1, self.queue2 = self.queue2, self.queue1

        return tmp

    def top(self) -> int:
        if self.empty():
            return None

        while len(self.queue1) > 1:
            self.queue2.append(self.queue1.popleft())

        tmp = self.queue1.popleft()
        self.queue2.append(tmp)

        self.queue1, self.queue2 = self.queue2, self.queue1
        return tmp

    def empty(self) -> bool:
        return False if self.queue1 else True

思路:

法二:

这里只采用一个队列实现,记录队列的长度,每pop出一个元素,便重新添加到队列末尾,直到最后一个pop出来,前面的已经重新添加在原最后一个元素后面。

class MyStack:

    def __init__(self):
        self.queue = deque()

    def push(self, x: int) -> None:
        self.queue.append(x)

    def pop(self) -> int:
        if self.empty():
            return None

        for i in range(len(self.queue)-1):
            self.queue.append(self.queue.popleft())

        return self.queue.popleft()

    def top(self) -> int:
        if self.empty():
            return None

        for i in range(len(self.queue) - 1):
            p = self.queue.popleft()
            self.queue.append(p)

        tmp = self.queue.popleft()
        self.queue.append(tmp)

        return tmp

    def empty(self) -> bool:
        return False if self.queue else True

感想:今天题不难,可以加深对栈,队列的理解,写的时候细心点,便没什么问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值