一、 栈(Stack)
1.1 概念 栈:
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守先进后出的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。
1.2 栈的方法:
二、队列(Queue)
2.1 概念 队列:
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特性。
入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头 (Head/Front)。
在Java中,Queue是个接口,底层是通过链表实现的。
2.2 队列的方法:
2.3 循环队列:
循环队列我们通过数组来实现,循环队列中通常会定义一个头指针(front)和一个尾指针(rear),用于标记队列的头部和尾部位置。
头指针front指向队列的第一个元素,尾指针rear指向队列中最后一个元素的下一个位置。
在循环队列中,元素的插入和删除都是在尾指针rear的位置进行,当rear到达数组的末尾时,若队列尚有空间,则rear会返回到数组的开头。
小问题:下图循环队列 我们如何把下标从7位置,挪到0位置呢
答案是:(index + 1) % length
(7 + 1) % 8 = 0
循环列表的判空和判满:
判空:一个空的循环队列。头指针和尾指针 都在零位置,所以空的时候就是,他俩下标相等时。
判满:随着数据的添加,头位置一直在向前加,满了以后,不能拿他俩相等作为判断条件,这里我们有三种方式:
1. 通过添加 size 属性记录:这种方法是在循环队列的实现中添加一个size属性,用于记录当前队列中元素的数量。当队列中元素个数等于队列的容量时,即size等于 length 时,表示队列已满。
2. 保留一个位置:在循环队列中,通常会牺牲一个位置不存储元素,这个位置可以用来区分队列是空还是满。当队列满时,队列中的元素数量会比队列的容量少一个。因此,当rear指针与front指针之间的元素数量等于 length -1 时,表示队列已满。
3. 使用标记:这种方法是在循环队列的实现中使用一个标记来表示队列是否已满。当rear指针追上front指针时,表示队列已满。在这种方法中,需要注意处理rear指针追上front指针的情况,以免造成错误的判断。