用栈实现队列&&用队列实现栈(LeetCode 232&&225)
发布人:shili8
发布时间:2025-01-09 10:03
阅读次数:0
**用栈实现队列 && 用队列实现栈**
在计算机科学中,栈和队列是两种基本的数据结构,它们分别用于后进先出(LIFO)和先进先出(FIFO)的操作。虽然它们看起来很相似,但它们有着不同的使用场景和特点。在本文中,我们将讨论如何用栈实现队列和用队列实现栈。
**1. 用栈实现队列**
在 LeetCode232 中,我们被要求设计一个用栈实现队列的数据结构。这个问题看起来很简单,但实际上它需要我们深入理解栈和队列之间的关系。
### 栈实现队列的基本思路栈是一种后进先出(LIFO)的数据结构,而队列是一种先进先出(FIFO)的数据结构。虽然它们看起来很相反,但我们可以利用栈的特性来实现队列的功能。
基本思路是:当我们需要从队列中取出元素时,我们可以将所有元素都压入一个栈中,然后再次弹出栈顶元素。这就实现了队列的先进先出(FIFO)特性。
###代码示例
class MyQueue: def __init__(self): """ Initialize your data structure here. """ self.stack = [] def push(self, x: int) -> None: """ Push element x to the back of queue. """ # 将元素压入栈中 self.stack.append(x) def pop(self) -> int: """ Removes the element from in front of queue and returns that element. """ # 检查栈是否为空 if not self.stack: raise IndexError("pop from an empty stack") # 将所有元素弹出到另一个栈中,直到只剩下一个元素 temp = [] while len(self.stack) >1: temp.append(self.stack.pop()) # 弹出栈顶元素 result = self.stack.pop() # 将其他元素重新压入栈中 while temp: self.stack.append(temp.pop()) return result def peek(self) -> int: """ Get the front element. """ # 检查栈是否为空 if not self.stack: raise IndexError("peek from an empty stack") # 将所有元素弹出到另一个栈中,直到只剩下一个元素 temp = [] while len(self.stack) >1: temp.append(self.stack.pop()) # 弹出栈顶元素 result = self.stack.pop() # 将其他元素重新压入栈中 while temp: self.stack.append(temp.pop()) return result def empty(self) -> bool: """ Return whether the queue is empty. """ return not self.stack
###代码注释* `push(x)` 方法将元素压入栈中。
* `pop()` 方法弹出栈顶元素,并将其他元素重新压入栈中,以实现队列的先进先出(FIFO)特性。
* `peek()` 方法返回栈顶元素,但不弹出该元素。
* `empty()` 方法检查栈是否为空。
**2. 用队列实现栈**
在 LeetCode225 中,我们被要求设计一个用队列实现栈的数据结构。这个问题看起来很简单,但实际上它需要我们深入理解队列和栈之间的关系。
### 队列实现栈的基本思路队列是一种先进先出(FIFO)的数据结构,而栈是一种后进先出(LIFO)的数据结构。虽然它们看起来很相反,但我们可以利用队列的特性来实现栈的功能。
基本思路是:当我们需要将元素压入栈中时,我们可以将所有元素都排成一个队列,然后再次取出队首元素并将其压入另一个队列中。这就实现了栈的后进先出(LIFO)特性。
###代码示例
class MyStack: def __init__(self): """ Initialize your data structure here. """ self.queue = [] def push(self, x: int) -> None: """ Push element x to the stack. """ # 将元素压入队列中 self.queue.append(x) # 将其他元素排成一个新的队列 temp = [] while len(self.queue) >1: temp.append(self.queue.pop(0)) # 将新队首元素压入原队列 self.queue.insert(0, temp[0]) # 将其他元素重新排成原队列 while temp: self.queue.append(temp.pop()) def pop(self) -> int: """ Removes the element from in top of stack and returns that element. """ return self.queue.pop(0) def peek(self) -> int: """ Get the top element. """ return self.queue[0] def empty(self) -> bool: """ Return whether the queue is empty. """ return not self.queue
###代码注释* `push(x)` 方法将元素压入栈中。
* `pop()` 方法弹出栈顶元素。
* `peek()` 方法返回栈顶元素,但不弹出该元素。
* `empty()` 方法检查队列是否为空。
通过以上的代码示例和注释,我们可以看出,虽然用栈实现队列和用队列实现栈看起来很相似,但它们有着不同的使用场景和特点。