📅  最后修改于: 2023-12-03 15:37:49.730000             🧑  作者: Mango
堆栈(Stack)和队列(Queue)都是常用的线性数据结构,它们都是一系列元素的集合。但是它们之间有很大的区别,下面将从几个方面进行介绍。
堆栈是一种后进先出(LIFO)的数据结构,它只允许在表的一端进行插入和删除操作。也就是说,最后入栈的元素最先出栈。
队列是一种先进先出(FIFO)的数据结构,它允许在表的一端进行插入操作,在表的另一端进行删除操作。也就是说,最先进入队列的元素最先出队列。
堆栈只有两种基本操作:压入(push)和弹出(pop)。
压入操作将元素插入栈顶,弹出操作将栈顶元素弹出。
stack.push(elem); // 压入元素
stack.pop(); // 弹出元素
队列有三种基本操作:入队(enqueue)、出队(dequeue)和查看队头元素(peek)。
入队操作将元素插入队尾,出队操作将队头元素删除并返回,查看队头元素则是返回队头元素而不删除。
queue.enqueue(elem); // 入队
queue.dequeue(); // 出队
queue.peek(); // 查看队头元素
堆栈最常见的应用场景就是函数调用的过程中的内存管理。在函数调用时,函数的局部变量会被保存在栈中,当函数执行完毕返回时,栈中这些局部变量就被删除。
public int fact(int n) {
if (n == 0) {
return 1;
}
return n * fact(n - 1);
}
int result = fact(5);
在上面的代码中,每次调用 fact
函数都会压入一个新的栈帧,当递归结束时,栈帧被弹出,函数调用的过程就结束了。如果没有堆栈,递归函数调用是无法实现的。
队列最常见的应用场景是在消息传递系统中。消息传递系统通常会有一个消息队列,消息生产者将消息入队,消息消费者将消息出队并进行处理。
class Message {
private String content;
public Message(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
class Producer {
public void sendMessage(Queue<Message> queue, String content) {
Message message = new Message(content);
queue.enqueue(message);
}
}
class Consumer {
public void receiveMessage(Queue<Message> queue) {
while (!queue.isEmpty()) {
Message message = queue.dequeue();
// 进行消息处理
}
}
}
Queue<Message> queue = new LinkedList<>();
Producer producer = new Producer();
Consumer consumer = new Consumer();
producer.sendMessage(queue, "Hello");
producer.sendMessage(queue, "World");
consumer.receiveMessage(queue);
在上面的代码中,Producer
负责生产消息,Consumer
负责消费消息,两者之间通过队列进行通信。如果没有队列,生产者和消费者之间的通信就会变得非常麻烦。