题目描述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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()