使用栈(Stack)来实现队列(Queue)的行为虽然不是最高效的方法(因为栈是后进先出LIFO,而队列是先进先出FIFO),但可以通过两个栈来实现这一功能。基本思路是,使用一个栈作为主栈(mainStack)来执行入队操作(push),而另一个栈(auxStack)则用于辅助出队操作(pop)。当需要出队时,如果辅助栈为空,则将主栈中的所有元素弹出并压入辅助栈中,这样原先主栈的栈底元素(即最早进入的元素)就位于辅助栈的栈顶,可以直接弹出。
import java.util.Stack;
public class MyQueue<T> {
private Stack<T> mainStack; // 主栈,用于执行入队操作
private Stack<T> auxStack; // 辅助栈,用于执行出队操作
public MyQueue() {
mainStack = new Stack<>();
auxStack = new Stack<>();
}
// 入队操作
public void push(T x) {
mainStack.push(x);
}
// 出队操作
public T pop() {
if (auxStack.isEmpty()) { // 如果辅助栈为空,将主栈所有元素移到辅助栈
while (!mainStack.isEmpty()) {
auxStack.push(mainStack.pop());
}
}
if (auxStack.isEmpty()) { // 如果两个栈都为空,则队列为空,抛出异常
throw new IllegalStateException("Queue is empty");
}
return auxStack.pop(); // 返回辅助栈的栈顶元素
}
// 查看队首元素
public T peek() {
if (auxStack.isEmpty()) { // 同上,如果辅助栈为空,将主栈所有元素移到辅助栈
while (!mainStack.isEmpty()) {
auxStack.push(mainStack.pop());
}
}
if (auxStack.isEmpty()) { // 如果两个栈都为空,则队列为空,抛出异常
throw new IllegalStateException("Queue is empty");
}
return auxStack.peek(); // 返回辅助栈的栈顶元素,但不移除
}
// 检查队列是否为空
public boolean isEmpty() {
return mainStack.isEmpty() && auxStack.isEmpty();
}
public static void main(String[] args) {
MyQueue<Integer> queue = new MyQueue<>();
// 入队
queue.push(1);
queue.push(2);
queue.push(3);
// 查看队首元素
System.out.println("Front element: " + queue.peek()); // 输出: Front element: 1
// 出队
System.out.println("Popped element: " + queue.pop()); // 输出: Popped element: 1
System.out.println("New front element: " + queue.peek()); // 输出: New front element: 2
// 队列不为空
System.out.println("Queue is empty: " + queue.isEmpty()); // 输出: Queue is empty: false
// 继续出队直到队列为空
while (!queue.isEmpty()) {
System.out.println("Popped element: " + queue.pop());
}
// 队列为空
System.out.println("Queue is empty: " + queue.isEmpty()); // 输出: Queue is empty: true
}
}
4816

被折叠的 条评论
为什么被折叠?



