0
点赞
收藏
分享

微信扫一扫

算法练习——用栈实现队列 leetcode.232 python

题目描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

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

题前准备:

栈的基础操作:

class Stack:
    def __init__(self):
        self.items = []
    def isEmpty(self): # 栈是否为空
        return self.items == []
    def push(self, item): # 压栈
        self.items.append(item)
    def pop(self): # 出栈
        return self.items.pop()
    def peek(self): # 返回最后一个元素
        return self.items[len(self.items)-1]
    def size(self): # 长度
        return len(self.items)

S = Stack()
print(S.isEmpty())
print(S.push('dog'))
print(S.peek())
print(S.push(4))
print(S.size())
print(S.push('pig'))
print(S.pop())

队列的基础操作: 

class Queue():
    def __init__(self):
        self.items = []
    def isEmpty(self): # 是否队列空
        return  self.items == []
    def enqueue(self,item): # 入队
        self.items.insert(0,item)
    def dequeue(self): # 出队
        return self.items.pop()
    def size(self): # 队列长度
        return len(self.items)

q = Queue()
print(q.isEmpty())
print(q.enqueue(4))
print(q.enqueue('dog'))
print(q.size())
print(q.dequeue())
print(q.size())

题目解答:

思路:用双栈模拟队列操作,基础栈+辅助栈。辅助栈的目的是在模拟“出队”时将元素倒序。

class Stack:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def push(self, item):
        self.items.append(item)
    def pop(self):
        return self.items.pop()
    def peek(self): # 返回最后一个元素
        return self.items[len(self.items)-1]
    def size(self):
        return len(self.items)
    def length(self):
        return len(self.items)

class MyQueue:
    def __init__(self):
        self.stack_basic = Stack()  # 基础栈
        self.stack_auxiliary = Stack()  # 辅助栈
    def push(self, x: int):
        self.stack_basic.push(x)
    def pop(self): 
        while self.stack_basic.length()>0:
            self.stack_auxiliary.push(self.stack_basic.pop())
        ret = self.stack_auxiliary.pop() # 辅助栈的栈顶
        while self.stack_auxiliary.length()>0:
            self.stack_basic.push(self.stack_auxiliary.pop())
        return ret
    def peek(self):
        while self.stack_basic.length()>0:
            self.stack_auxiliary.push(self.stack_basic.pop())
        ret = self.stack_auxiliary.pop()
        self.stack_basic.push(ret) # 因为是peek操作,出栈后还要回来(此时直接进入基础栈或进入辅助栈均可
        while self.stack_auxiliary.length()>0:
            self.stack_basic.push(self.stack_auxiliary.pop())
        return ret
    def empty(self):
        return self.stack_basic.isEmpty()
举报

相关推荐

0 条评论