1. 栈与队列基础概念回顾
在计算机科学中,栈(Stack)和队列(Queue)是两种最基本的数据结构,它们都是线性表,但在操作特性上有着本质区别。
栈遵循LIFO(Last In First Out)原则,就像我们平时叠放的盘子,最后放上去的盘子总是最先被取用。栈的基本操作包括:
- push:将元素压入栈顶
- pop:弹出栈顶元素
- peek:查看栈顶元素但不弹出
- isEmpty:判断栈是否为空
队列则遵循FIFO(First In First Out)原则,类似于现实生活中的排队,先来的人先得到服务。队列的基本操作包括:
- enqueue:将元素加入队尾
- dequeue:从队头移除元素
- front:查看队头元素
- isEmpty:判断队列是否为空
在Java中,Stack类直接实现了栈结构,而Queue是一个接口,常用实现类有LinkedList和ArrayDeque。理解这两种数据结构的特性和差异,是解决相关算法问题的基础。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用栈实现队列(LC 232)
2.1 问题分析与设计思路
题目要求使用栈来实现队列的所有操作,包括push、pop、peek和empty。由于栈和队列的操作顺序完全相反,我们需要找到一种方法,用栈的LIFO特性来模拟队列的FIFO特性。
核心思路是使用两个栈:
- inStack:专门处理入队操作
- outStack:专门处理出队操作
当需要出队时,如果outStack为空,就将inStack中的所有元素"倒"到outStack中。这样,元素的顺序就被反转了一次,正好符合队列的FIFO顺序。
2.2 Java实现详解
java复制class MyQueue {
private Stack<Integer> inStack;
private Stack<Integer> outStack;
public MyQueue() {
inStack = new Stack<>();
outStack = new Stack<>();
}
public void push(int x) {
inStack.push(x);
}
public int pop() {
if (outStack.isEmpty()) {
while (!inStack.isEmpty()) {
outStack.push(inStack.pop());
}
}
return outStack.pop();
}
public int peek() {
if (outStack.isEmpty()) {
while (!inStack.isEmpty()) {
outStack.push(inStack.pop());
}
}
return outStack.peek();
}
public boolean empty() {
return inStack.isEmpty() && outStack.isEmpty();
}
}
2.3 时间复杂度分析
虽然pop和peek操作在最坏情况下是O(n)(需要
