题目简述:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
思路:
1. 用collections里的deque实现
2. 初始化函数构建两个队列
3. push函数利用append直接实现功能,append到queue_in队列中
4. pop函数实现步骤--首先确认非空--把queue_in所有元素(除了最后一个)依次出列放入queue_out--交换两个队列,此时out只有一个元素--把out里面的元素pop出来
5. top函数实现--首先确认非空--直接返回倒数第一个数
6. empty函数实现,直接return队列queue_in
代码如下:
from collections import deque class MyStack: def __init__(self): """ Python普通的Queue或SimpleQueue没有类似于peek的功能 也无法用索引访问,在实现top的时候较为困难。 用list可以,但是在使用pop(0)的时候时间复杂度为O(n) 因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能 in - 存所有数据 out - 仅在pop的时候会用到 """ self.queue_in = deque() self.queue_out = deque() def push(self, x: int) -> None: """ 直接append即可 """ self.queue_in.append(x) def pop(self) -> int: """ 1. 首先确认不空 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out 4. 交换in和out,此时out里只有一个元素 5. 把out中的pop出来,即是原队列的最后一个 tip:这不能像栈实现队列一样,因为另一个queue也是FIFO,如果执行pop()它不能像 stack一样从另一个pop(),所以干脆in只用来存数据,pop()的时候两个进行交换 """ if self.empty(): return None 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 # 交换in和out,这也是为啥in只用来存 return self.queue_out.popleft() def top(self) -> int: """ 1. 首先确认不空 2. 我们仅有in会存放数据,所以返回第一个即可 """ if self.empty(): return None return self.queue_in[-1] def empty(self) -> bool: """ 因为只有in存了数据,只要判断in是不是有数即可 """ return len(self.queue_in) == 0
或者在push函数中就把数据整理成后进先出的结构,代码如下:
class MyStack: def __init__(self): """ Initialize your data structure here. """ self.queue1 = collections.deque() self.queue2 = collections.deque() def push(self, x: int) -> None: """ Push element x onto stack. """ self.queue2.append(x) while self.queue1: self.queue2.append(self.queue1.popleft()) self.queue1, self.queue2 = self.queue2, self.queue1 def pop(self) -> int: """ Removes the element on top of the stack and returns that element. """ return self.queue1.popleft() def top(self) -> int: """ Get the top element. """ return self.queue1[0] def empty(self) -> bool: """ Returns whether the stack is empty. """ return not self.queue1
232. 用栈实现队列
题目简述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false。
思路:
1. 用到两个栈,分别为输入栈,输出栈
2. 输入栈用于压入push传入的数据;输出栈用于pop和peek操作
3. 每次pop和peek时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序
代码如下:
class MyQueue(object): def __init__(self): self.stack1 = [] self.stack2 = [] def push(self, x): self.stack1.append(x) def pop(self): if not self.stack2: while self.stack1: self.stack2.append(self.stack1.pop()) return self.stack2.pop() def peek(self): if not self.stack2: while self.stack1: self.stack2.append(self.stack1.pop()) return self.stack2[-1] def empty(self): return not self.stack1 and not self.stack2
总结:
1. 两个栈可以构建一个队列
2. 两个队列可以构建一个栈
标签:队列,self,pop,queue,用栈,day10,def,out From: https://www.cnblogs.com/cp1999/p/17278434.html