数据结构中的栈,堆和队列
在学习数据结构的过程中经常会看到栈,堆,队列。那这三者互相之间是什么关系呢?今天我来给大家解释一下。
栈:又名堆栈,是一种运算受限的线性表。只允许在栈顶插入和删除元素。栈顶是低位,栈底是高位。栈中没有元素时称为空栈,栈符合先进后出原则。
简单点来说栈的插入和删除就跟叠箱子一样,我们取出放在箱子里面底下的东西(放入时间较早的物体),我们首先要移开压在它上面的物体(放入时间较晚的物体)。 在栈中最重要的操作就是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); } } }
下一篇:
算法温习——手撕快速排序