队列栈(Queue Stack)
队列栈(Queue Stack)是使用两个队列实现的栈结构。在队列栈中,我们使用两个队列来模拟栈的行为。其中,一个队列用于存储栈中的元素,另一个队列用于辅助实现入栈和出栈操作。
在入栈操作时,我们将元素插入到队列中,保证该队列的队首为栈顶元素;在出栈操作时,我们将该队列中除队尾元素外的所有元素依次出队,并插入到辅助队列中,然后将队尾元素出队,即为出栈元素。这样,就实现了使用队列模拟栈的功能。
以下是一个简单的队列栈的实现示例,使用 Java 语言实现:
import java.util.LinkedList;
import java.util.Queue;
public class QueueStack<Item> {
private Queue<Item> queue1;
private Queue<Item> queue2;
public QueueStack() {
this.queue1 = new LinkedList<>();
this.queue2 = new LinkedList<>();
}
public boolean isEmpty() {
return queue1.isEmpty();
}
public int size() {
return queue1.size();
}
public void push(Item item) {
queue2.offer(item);
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
Queue<Item> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public Item pop() {
if (isEmpty()) {
throw new RuntimeException("Stack underflow");
}
return queue1.poll();
}
public Item peek() {
if (isEmpty()) {
throw new RuntimeException("Stack underflow");
}
return queue1.peek();
}
}
在上述实现中,我们使用泛型 Item 表示栈中的元素类型。QueueStack 类包含了 isEmpty、size、push、pop 和 peek 五个方法,分别用于判断队列栈是否为空、获取队列栈的大小、入栈、出栈和返回栈顶元素。我们使用两个 LinkedList 实现了两个队列 queue1 和 queue2,并在入栈时实现了栈的操作。其中,我们先将元素插入到 queue2 中,并将 queue1 中的所有元素依次出队,并插入到 queue2 中。然后,我们交换 queue1 和 queue2 的指针,这样 queue1 就成为了存储栈中元素的队列。在出栈和返回栈顶元素时,我们直接访问 queue1 的队首元素即可。