栈与队列理论基础
Summary
本文介绍了栈和队列在STL(C++标准库)中的基本概念和实现原理。栈和队列都属于STL中的容器适配器,其底层实现可以使用不同的容器,如vector、deque和list。
Facts
栈和队列是STL(C++标准库)中的两个数据结构,属于容器适配器。
STl有多个版本,包括HP STL、P.J.Plauger STL和SGI STL。
栈的特点是先进后出,提供push和pop等接口,底层实现可以是vector、deque或list。
SGI STL中栈的缺省底层实现是deque。
队列的特点是先进先出,底层实现也可以是vector、deque或list。
SGI STL中队列的缺省底层实现是deque。
使用其他编程语言时,也要考虑栈和队列的底层实现,深入了解其内部原理。
232. 用栈实现队列 - 力扣(Leetcode)
时间不够,直接阅读的标准代码,具体如下
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:
"""
Removes the element from in front of queue and returns that element.
"""
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:
"""
Get the front element.
"""
ans = self.pop()
self.stack_out.append(ans)
return ans
def empty(self) -> bool:
"""
只要in或者out有元素,说明队列不为空
"""
return not (self.stack_in or self.stack_out)
下面是GPT4对上述代码的解释
这段代码定义了一个名为 MyQueue 的类,它用两个栈(即 “stack_in” 和
“stack_out”)来模拟队列的行为。队列是一种数据结构,其中的元素以先进先出(FIFO)的顺序被添加和删除,而栈是一种数据结构,其中的元素以后进先出(LIFO)的顺序被添加和删除。现在让我们更深入地分析每个方法:
__init__
方法是类的初始化方法,它在创建类的新实例时被调用。这里,它用于初始化两个空栈: “stack_in” 和 “stack_out”。
push
方法用于将元素添加到队列的末尾,对应的是栈 “stack_in” 的 push 操作。
pop
方法用于从队列的前端移除并返回一个元素。首先,它会检查队列是否为空,如果为空,则返回 None。如果不为空,然后它会检查 “stack_out” 是否为空。如果 “stack_out” 不为空,则从中 pop 出一个元素;如果 “stack_out”
为空,那么它会将 “stack_in” 中的所有元素 pop 出来并 push 到 “stack_out” 中,然后从
“stack_out” 中 pop 出一个元素。
peek
方法用于获取队列前端的元素,但不删除它。它通过调用pop
方法并将结果立即 push 回 “stack_out” 来实现这一点。
empty
方法检查队列是否为空。如果 “stack_in” 或 “stack_out” 中至少有一个元素,则队列不为空。通过这种方式,这个类成功地使用两个栈来模拟队列的行为。尽管这可能不如直接使用队列那样直观或效率高,但这是一个常见的计算机科学问题和面试问题,用来测试候选人对数据结构和算法的理解。
225. 用队列实现栈 - 力扣(Leetcode)
时间不够,直接阅读的标准代码,具体如下
from collections import 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
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]
def empty(self) -> bool:
return not self.que
下面是GPT4对上述代码的解释
这段代码定义了一个名为
MyStack
的类,它使用一个队列(deque)来模拟栈的行为。
栈是一种数据结构,其中元素以后进先出(LIFO)的顺序被添加和删除,而队列是一种数据结构,其中元素以先进先出(FIFO)的顺序被添加和删除。
在Python 中,collections.deque
是一个双端队列,可以在两端进行元素的添加和删除操作。现在让我们详细解释每个方法:
__init__
方法是类的构造函数,它在创建新的类实例时被调用。这里,它用于初始化一个空的双端队列。
push
方法用于将元素添加到栈顶,对应的是队列的尾部添加操作。
pop
方法用于从栈顶移除并返回一个元素。首先,它会检查栈是否为空,如果为空,则返回 None。如果栈不为空,那么它会将队列前面的元素移动到队列尾部,直到只剩下最后添加的元素,然后移除并返回该元素。
top
方法用于获取栈顶的元素,但不删除它。如果栈为空,返回 None;否则,返回队列的最后一个元素(即栈顶元素)。
empty
方法用于检查栈是否为空。如果队列为空,则栈为空。通过这种方式,该类成功地使用一个队列来模拟栈的行为。尽管这可能不如直接使用栈那样直观或效率高,但这是一个常见的计算机科学问题和面试问题,用来测试候选人对数据结构和算法的理解。
总结
两个栈可以实现队列,一个双端队列可以实现栈(from collections import deque)