Day10代码随想录栈与队列基础part01-232.用栈实现队列、225. 用队列实现栈

队列:先进先出

栈:先进后出

232.用栈实现队列

**思路:**一个in栈,一个out栈

重点:

(1)pop操作:这个过程是如果stackout里面有值,说明队列先进先出的还在里面;如果stackout没有值了,那就重新出栈转移这个过程

(2)peek查看队列顶部操作:注意pop出来的元素要返回的是stack_out!!所以相当于pop进来再用append给push进去

(3)对于列表list的pop:默认值是pop(-1)也就是删除最后一个元素,所以append是能把他再返回来的!但是也可以写pop(0)相当于队列的操作

class MyQueue:

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

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

    def pop(self) -> int:
        '''
        这个过程是如果stackout里面有值,说明队列先进先出的还在里面
        如果stackout没有值了,那就重新出栈转移这个过程
        '''
        if self.empty():
            return None
        if self.stack_out:
            return self.stack_out.pop()
        else:
            for i in range(len(self.stack_in)):
                self.stack_out.append(self.stack_in.pop())
                print('stack_in',self.stack_in, 'self.stack_out', self.stack_out)
            return self.stack_out.pop()

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

    def empty(self) -> bool:
        return not (self.stack_in or self.stack_out)

225. 用队列实现栈

思路:其实这道题目就是用一个队列就够了。一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。也就是长度为k,弹出k-1个再返回队尾就是栈的先进后出了!

一些补充:Python collections模块之deque详解,collections又提供了一些常用容器

collections模块常用类型有:原文链接:Python collections模块之deque()详解_python collections.deque-CSDN博客

  • 双向队列(deque):类似于list的容器,可以快速的在队列头部和尾部添加、删除元素
  • 计数器(Counter):dict的子类,计算可hash的对象
  • 默认字典(defaultdict):dict的子类,可以调用提供默认值的函数
  • 有序字典(OrderedDict):dict的子类,可以记住元素的添加顺序
  • 可命名元组(namedtuple):可以创建包含名称的tuple

针对于deque双端队列的一些用法:

  • append():从右端添加元素(与list同
st = "abcd"
list1 = [0, 1, 2, 3]
dst = deque(st)
dlist1 = deque(list1)
dst.append(4)
dlist1.append("k")
print(dst)
print(dlist1)
#结果:
#deque(['a', 'b', 'c', 'd', 4])
#deque([0, 1, 2, 3, 'k'])
  • appendleft():从左端添加
  • pop():移除列表中的一个元素(默认最右端的一个元素),并且返回该元素的值(与list同),如果没有元素,将会报出IndexError
from collections import deque
st = "abcd"
list1 = [0, 1, 2, 3]
dst = deque(st)
dlist1 = deque(list1)
p = dst.pop()
p1 = dlist1.pop()
print(p)
print(p1)
print(dst)
print(dlist1)
#结果:
#d
#3
#deque(['a', 'b', 'c'])
#deque([0, 1, 2])
  • popleft():移除左端的元素
  • count():统计元素总个数
  • **insert(index,obj):**在指定位置插入元素
  • rotate(n):从右侧反转n步,如果n为负数,则从左侧反转
from collections import deque

st = "abbcd"
dst = deque(st)
dst.rotate(1)
print(dst)
#结果:
#deque(['d', 'a', 'b', 'b', 'c'])

本题代码:

from collections import deque
class MyStack:

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

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

    def pop(self) -> int:
        if self.empty():
            return None
        for i in range(len(self.que)-1):
            self.que.append(self.que.popleft())
        return self.que.popleft()

    def top(self) -> int:
        if self.empty():
            return None
        for i in range(len(self.que)-1):
            self.que.append(self.que.popleft())
        temp = self.que.popleft()
        self.que.append(temp)
        return temp

    def empty(self) -> bool:
        return not self.que

# 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()

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值