在学习数据结构的过程中经常会看到栈,堆,队列。那这三者互相之间是什么关系呢?今天我来给大家解释一下。
栈:又名堆栈,是一种运算受限的线性表。只允许在栈顶插入和删除元素。栈顶是低位,栈底是高位。栈中没有元素时称为空栈,栈符合先进后出原则。
简单点来说栈的插入和删除就跟叠箱子一样,我们取出放在箱子里面底下的东西(放入时间较早的物体),我们首先要移开压在它上面的物体(放入时间较晚的物体)。
在栈中最重要的操作就是push(添加)和pop(删除)
push:在栈的顶端放入一个元素
pop:在栈的顶端移除一个元素,并返回被删除的元素
Java代码实现(有兴趣的小伙可以自己运行一下)
import java.util.Stack;
public class Test {
public static void main(String[] args) {
//定义一个栈 stack 存放字符串
Stack<String> stack = new Stack<>();
stack.push("VIP1");
stack.push("VIP2");
System.out.println("栈初始化:"+stack);
//往栈中添加一个VIP3
stack.push("VIP3");
System.out.println("添加后的栈:"+stack);
//对栈删除一个元素
String pop = stack.pop();
System.out.println("被删除的元素:"+pop);
System.out.println("删除后的栈:"+stack);
}
}
堆:堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,指的就是完全二叉树也就是二叉堆。 堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。如果堆中如果节点的值都大于等于其子节点的值,我们把它称为大顶堆,如果都小于等于其子节点的值,我们将其称为小顶堆。
由于堆的这个特性,常用来实现优先队列
由于堆的篇幅过多,堆的详细内容后面会专门开一个blog讲的
队列:队列是一种运算受限的线性表。 特殊之处在于它只允许在队列的前端进行删除操作,而在队列的后端进行插入操作。当队列中没有元素时,称为空队列。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。与栈所的先进后出的原则,队列的原则是先进先出
在Java中LinkedList实现了Queue的接口,所以可以用LinkedList来表示链表
(当然也可以用数组和两个堆栈去实现)
import java.util.LinkedList;
import java.util.Queue;
public class Test {
public static void main(String[] args) {
//定义一个链表
Queue<String> queue = new LinkedList<String>();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
//初始化的链表
for(String q : queue){
System.out.println(q);
}
System.out.println("新增一个元素d:"+queue.offer("d"));
System.out.println("遍历链表");
for(String q : queue){
System.out.println(q);
}
System.out.println("删除一个元素:"+queue.poll()); //返回第一个元素,并在队列中删除
System.out.println("遍历链表");
for(String q : queue){
System.out.println(q);
}
}
}