第十天 栈 232. 用栈实现队列

栈的知识点

push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。

在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。

最后如何判断队列为空呢?如果进栈和出栈都为空的话,说明模拟的队列为空了。

232. 用栈实现队列

题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

思路:栈的实现,关于pop()和peek(),个人感觉第二个比较好理解

class MyQueue:

    def __init__(self):
        """
        in主要负责push,out主要负责pop
        """
        self.stack_in=[]
        self.stack_out=[]
    def push(self, x: int) -> None:
        """
        有元素进,就往in里push
        """
        self.stack_in.append(x)

    def pop(self) -> int:
        '''
        从队列前面删除元素并返回该元素。
        '''
        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())
            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)
def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        # self.stack2用于弹出元素,如果self.stack2为[],则将self.stack1中元素全部弹出给self.stack2
        if self.stack2 == []:
            while self.stack1:
                tmp = self.stack1.pop()
                self.stack2.append(tmp)
        return self.stack2.pop()

    def peek(self) -> int:
        """
        得到队首第一个元素
        """
        if self.stack2 == []:
            while self.stack1:
                tmp = self.stack1.pop()
                self.stack2.append(tmp)
        #倒序输出
        return self.stack2[-1]

225. 用队列实现栈

题目:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsize 和 is empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 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
        '''
        deque对象提供了popleft()方法用于从队列的左侧(队头(出口)取出并返回元素,然后再使用self.que.append()方法将取出的元素放入队列的右侧(队尾),实现了将队列中的元素依次向后移动的效果,一个一个的取出放入队尾入口
        '''
        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
        # return self.que[-1]

        # 写法二:
        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
class MyStack:

    def __init__(self):
        self.que_in=deque()
        self.que_out=deque()
    def push(self, x: int) -> None:
        self.que_in.append(x)

    def pop(self) -> int:
        if self.empty():
            return None
        '''
        先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out
        交换in和out,此时out里只有一个元素
        把out中的pop出来,即是原队列的最后一个

        tip:这不能像栈实现队列一样,因为另一个queue也是FIFO,如果执行pop()它不能像
        stack一样从另一个pop(),所以干脆in只用来存数据,pop()的时候两个进行交换
        '''
        for i in range(len(self.que_in)-1):
            self.que_out.append(self.que_in.popleft())
        self.que_in,self.que_out=self.que_out,self.que_in
        return self.que_out.popleft()

    def top(self) -> int:
        if self.empty():
            return None
        return self.que_in[-1]
        '''
        把out中的pop出来,即是原队列的最后一个,并使用temp变量暂存
        把temp追加到queue_in的末尾
        '''
        # for i in range(len(self.queue_in) - 1):
            # self.queue_out.append(self.queue_in.popleft())
        # self.queue_in, self.queue_out = self.queue_out, self.queue_in 
        # temp = self.queue_out.popleft()   
        # self.queue_in.append(temp)
        # return temp
    def empty(self) -> bool:
        return not (self.que_in or self.que_out)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值