「java队列push」java队列方法
今天给各位分享java队列push的知识,其中也会对java队列方法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java数组方法pop() push() unshift() shift()
JS中的数组提供了四个操作,以便让我们实现队列与堆栈!
小理论:
队列:先进先出
堆栈:后进先出
实现队列的方法:
shift:从集合中把第一个元素删除,并返回这个元素的值。
unshift: 在集合开头添加一个或更多元素,并返回新的长度
push:在集合中添加元素,并返回新的长度
pop:从集合中把最后一个元素删除,并返回这个元素的值。
这是原来老赵写的关于数组队列的代码,觉得有点问题,所以改了一下
1 // Usage:装载并运行函数
2 // 队列机制
3 var Resource = (function () {
4 var waitingCallbacks = [];
5 var execute = function (cb) {
6 setTimeout(function () {
7 cb(function () {
8 if (waitingCallbacks.length == 0) return;
9 execute(waitingCallbacks.shift());
10 });
11 }, 0);
12 };
13 var register = function (cb) {
14 if (waitingCallbacks.length == 0) {
15 execute(cb);
16 } else {
17 waitingCallbacks.push(cb);
18 }
19 }
20 return {
21 register: register,
22 state: 1
23 }
24 })();
原来代码中是
execute(waitingCallbacks.unshift());现在我改成了
execute(waitingCallbacks.shift());当你从集合中执行了函数后,它应该从集合中删除,而不是再添加,呵呵。
ArrayDeque
写cs61b题目时惊叹为什么会有这种东西,于是搜索了一番,发现这容器还是很有意思的,于是搬运了一下。
参考: ArrayDeque - (jianshu.com)
Java ArrayDeque - Java教程 - 菜鸟教程 (cainiaojc.com)
在ArrayDeque类实现这两个接口:Java Queue和Java Deque
使用了数组来存储数据,同时用两个int值 head 和 tail 来表示头部和尾部。不过需要注意的是 tail 并不是尾部元素的索引,而是尾部元素的 下一位 ,即下一个将要被加入的元素的索引。
ArrayDeque 有三个构造函数来初始化,除了无参的构造函数使用了默认容量,其它两个构造函数会通过 allocateElements 函数来计算初始容量
数组的大小很特殊,大小必为2的n次方(2^n)。下面我们看看 allocateElements 方法
(1)对于一个小于2^30的值,经过五次右移和位或操作后,可以得到一个 2^k - 1 的值。最后再将这个值 +1 ,得到 2^k 。通过这个方法,可以将一个任意的初始值转化为2^n的值.
(2)不过有一点不足在于,如果本身传进来的值就是 2^n 的值,那么经过转化会变成 2^(n+1) ,所以我们在不用刻意去传入 2^n 的值。
(3)如果传入的值大于等于 2^30 ,那么经过转化会变成负值,即 0,此时会把初始值设置为 2^30 ,即最大的容量只有 2^30
在ArrayDeque中,数组是作为环形来使用的,正常情况下在末尾添加元素后,tail=tail+1是要判断是否越界,如果越界,会变为从索引0开始。参考如下图片,当H添加到索引7后,tail值会+1,此时tail=8,但是越界了,所以应该将tail设置为0。
我们看看 tail = (tail + 1) (elements.length - 1) 的正确性:
所以当 tail+1 = length - 1 ,此时数组并没有越界, (tail + 1) (elements.length - 1) 后得到的还是 tail+1 。如果 tail + 1 = length ,此时数组越界了, (tail + 1) (elements.length - 1) 后得到0。
所以通过 (tail + 1) (elements.length - 1) 可以跳过条件判断在环形数组中获取正确的索引值,然后再判断新的 tail 是否等于 head ,如果结果为 true ,那么数组已经满了,需要扩容,即 doubleCapacity() 。
原理和addLast相同
无论是从头部还是从尾部添加元素,都会判断 tail==head ,如果两个索引相遇,说明数组空间已满,需要扩容操作.
ArrayDeque支持从头尾两端移除元素
在上文中,我们讲了怎么去实现一个ArrayDeque,但Java标准库中已经为我们准备好了,我们只需按规则使用就行
add() - 将指定的元素插入ArrayDeque双端队列的 末尾
addFirst() -在ArrayDeque双端队列的 开头 ,插入指定的元素
addLast() - 在ArrayDeque双端队列的 末尾 插入指定的内容(等效于 add() )
注意:如果ArrayDeque双端队列已满,则所有这些方法 add() , addFirst() 和 addLast() 都会引发IllegalStateException
offer() - 将指定的元素插入ArrayDeque双端队列的 末尾
offerFirst() - 在ArrayDeque双端队列的 开始处 插入指定的元素
offerLast() - 将指定的元素插入ArrayDeque双端队列的 末尾
注意: offer(),offerFirst()并offerLast()返回true是否成功插入元素;否则,返回。如果ArrayDeque双端队列已满,则这些方法返回false。
getFirst() - 返回ArrayDeque双端队列的 第一个元素
getLast() - 返回ArrayDeque双端队列的 最后一个元素
注:如果ArrayDeque双端队列为空,getFirst()和getLast()抛出NoSuchElementException。
peek() - 返回ArrayDeque双端队列的 第一个 元素
peekFirst() - 返回ArrayDeque双端队列的 第一个 元素(等效于 peek() )
peekLast() - 返回ArrayDeque双端队列的 最后一个 元素
注:如果ArrayDeque双端队列为空,peek(),peekFirst()和getLast()抛出 NoSuchElementException
remove() - 返回并从ArrayDeque双端队列的 第一个 元素中删除一个元素
remove(element) - 返回并从ArrayDeque双端队列的 头部 删除指定的元素
removeFirst() - 返回并从ArrayDeque双端队列中删除 第一个 元素(等效于remove())
removeLast() - 返回并从ArrayDeque双端队列中删除 最后一个元素
注意:如果数组双端队列为空,则remove(),removeFirst()和removeLast()方法将引发异常。 另外,如果找不到元素,则remove(element)会引发异常。
poll() - 返回并删除ArrayDeque双端队列的 第一个 元素
pollFirst() - 返回并删除ArrayDeque双端队列的 第一个 元素(等效于poll())
pollLast() - 返回并删除ArrayDeque双端队列的 最后一个 元素
注意:如果ArrayDeque双端队列为空,则如果找不到该元素,则poll(),pollFirst()和pollLast()返回null。
删除所有元素
iterator() - 返回可用于遍历ArrayDeque双端队列的 迭代器
descendingIterator() -返回一个迭代器,该迭代器可用于以 相反顺序 遍历ArrayDeque双端队列
注:为了使用这些方法,我们必须导入java.util.Iterator包。
使用迭代器的方法如下
element() -从ArrayDeque双端队列的头部返回一个元素。
contains(element) -在ArrayDeque双端队列中搜索指定的元素。如果找到该元素,则返回true,否则返回false。
size() -返回ArrayDeque双端队列的长度。
toArray() -将ArrayDeque双端队列转换为数组并返回。
clone() -创建ArrayDeque双端队列的副本并返回它。
push() - 在堆栈顶部添加一个元素
peek() - 从堆栈顶部返回一个元素
pop() - 返回并从堆栈顶部删除元素
java用数组实现队列
1.1. 队列的数据结构
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
1.2. Java实现
QueueTest
package ch04;
public class QueueTest {
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(10);
System.out.println(queue.isEmpty());
for (int i = 0; i 10; i++) {
queue.insert(i);
}
System.out.println(queue.isFull());
while (!queue.isEmpty()) {
System.out.println(queue.remove());
}
}
}
class ArrayQueue {
private int[] arrInt;// 内置数组
private int front;// 头指针
private int rear;// 尾指针
public ArrayQueue(int size) {
this.arrInt = new int[size];
front = 0;
rear = -1;
}
/**
* 判断队列是否为空
*
* @return
*/
public boolean isEmpty() {
return front == arrInt.length;
}
/**
* 判断队列是否已满
*
* @return
*/
public boolean isFull() {
return arrInt.length - 1 == rear;
}
/**
* 向队列的队尾插入一个元素
*/
public void insert(int item) {
if (isFull()) {
throw new RuntimeException("队列已满");
}
arrInt[++rear] = item;
}
/**
* 获得对头元素
*
* @return
*/
public int peekFront() {
return arrInt[front];
}
/**
* 获得队尾元素
*
* @return
*/
public int peekRear() {
return arrInt[rear];
}
/**
* 从队列的对头移除一个元素
*
* @return
*/
public int remove() {
if (isEmpty()) {
throw new RuntimeException("队列为空");
}
return arrInt[front++];
}
}
运行结果如下:
false
true
1
2
3
4
5
6
7
8
9
java中的队列都有哪些,有什么区别?
阻塞队列、普通队列,非阻塞队列。
阻塞队列与普通队列的而区别在于,当队列是空时,从队列中获取元素的操作会被阻塞,或则当队列是满的时,往队列中增加元素会被阻塞,试图从空的队列中取元素的线程或从满的队列中添加元素的线程同样会被阻塞。
队列的两个基本操作是inserting(插入)一个数据项,即把一个数据项放入队尾,另一个是removing(移除)一个数据项,即移除队头的数据项。这类似于电影爱好者排队买票时先排到队尾,然后到达队头买票后离开队列。
栈中的插入和移除数据项方法的命名是很标准,称为push和pop。队列的方法至今没有标准化的命名。“插入”可以称为put、add或enque,而“删除”可以叫delete、get或deque。插入数据项的队尾,也可以叫作back、tail或end。而移除数据项的队头,也可以叫head。下面将使用insert、remove、front和rear。
插入将值插入队尾,同时队尾箭头增加一,指向新的数据项。
关于java队列push和java队列方法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-25,除非注明,否则均为
原创文章,转载请注明出处。