美文网首页
剑指 Offer-09-用两个栈实现队列

剑指 Offer-09-用两个栈实现队列

作者: 阿凯被注册了 | 来源:发表于2020-10-30 08:45 被阅读0次

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


image.png

解题思路:

  1. 维护两个栈,stack1用来处理插入操作,stack2用来处理删除操作;
  2. 当执行插入操作时,直接将插入值加入到stack1中,stack1.append(val)
  3. 当执行删除操作时,先判断stack2是否为空,如果为空,将stack1中数据弹入到stack2中,例如[1,2,3]加入stack1再弹出的顺序是[3,2,1],那么弹入到stack2后从顶向底则是[1,2,3]
  4. 再判断stack2是否为空,若仍为空,则表示没有数据从stack1进入stack2,返回-1;
  5. 若不为空,弹出的顺序即是[1,2,3],和弹入到stack1的顺序一致,符合队列的先进先出规律。

Python3代码:

class CQueue:

    def __init__(self):
        self.stack1 = []
        self.stack2 = []

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

    def deleteHead(self) -> int:
        if not self.stack2:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        if not self.stack2:
            return -1
        else:
            return self.stack2.pop()
        
        
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()
# 实现peek和empty方法
class MyQueue:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.A = []
        self.B = []


    def push(self, x: int) -> None:
        """
        Push element x to the back of queue.
        """
        self.A.append(x)


    def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        if not self.B:
            while self.A:
                self.B.append(self.A.pop())
        if not self.B:
            return -1
        else: 
            return self.B.pop()


    def peek(self) -> int:
        """
        Get the front element.
        """
        if not self.B:
            while self.A:
                self.B.append(self.A.pop())
        if not self.B:
            return None
        else:
            return self.B[-1]


    def empty(self) -> bool:
        """
        Returns whether the queue is empty.
        """
        if self.A or self.B:
            return False
        else:
            return True


# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

相关文章

网友评论

      本文标题:剑指 Offer-09-用两个栈实现队列

      本文链接:https://www.haomeiwen.com/subject/asncvktx.html