线性表之队列(Queue)
简介队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
4.5.1、队列的定义
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
4.5.2、队列的实现
4.5.2.1、队列API设计
| 类名 | Queue |
|---|---|
| 构造方法 | Queue():创建Queue对象 |
| 成员变量 | private Node head:记录首结点 private int N:当前队列的元素个数 private Node last:记录最后一个结点 |
| 成员内部类 | private class Node:结点类 |
| 成员方法 | public boolean isEmpty():判断是否为空 public int size(): 获取队列的元素个数 public T dequeue():从队列拿去一个元素 public void enqueue(T t):往队列插入一个元素 |
4.5.2.2、队列实现和测试
实现类:
package cn.test.algorithm.datastruct;
import java.util.Iterator;
public class Queue<T> implements Iterable<T> {
@Override
public Iterator<T> iterator() {
return new SIterator();
}
private class SIterator implements Iterator {
private Node n;
public SIterator() {
this.n = head;
}
@Override
public boolean hasNext() {
return n.next != null;
}
@Override
public Object next() {
n = n.next;
return n.item;
}
}
//内部类
private class Node {
public T item;
public Node next;
public Node(T item, Node next) {
this.item = item;
this.next = next;
}
}
//首结点
private Node head;
//尾节点
private Node last;
//元素个数
private int N;
public Queue() {
head = new Node(null, null);
last = null;
N = 0;
}
//是否为空
public boolean isEmpty() {
return N == 0;
}
//栈的元素个数
public int size() {
return N;
}
//插入元素
public void enqueue(T t) {
//当前尾结点为null
if (last == null) {
last = new Node(t, null);
head.next = last;
} else {
//当前尾节点不为null
Node oldLast = last;
last = new Node(t, null);
oldLast.next = last;
}
N++;
}
//移除元素
public T dequeue() {
if (isEmpty()) {
return null;
}
Node oldFirst = head.next;
head.next = oldFirst.next;
N--;
//如果删除后为空,那么last就必须要设置为空
if (isEmpty()) {
last = null;
}
return oldFirst.item;
}
}
测试类:
package cn.test.algorithm.test;
import cn.test.algorithm.datastruct.Queue;
public class QueueTest {
public static void main(String[] args) {
Queue<Integer> queue = new Queue<>();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);
System.out.println("==============入队列测试==============");
System.out.println("队列里元素个数:" + queue.size());
System.out.println("队列里的数据:");
for (Integer item : queue) {
System.out.println(item);
}
System.out.println("====================出队列测试=====================");
Integer result = queue.dequeue();
System.out.println("队列里元素个数:" + queue.size());
System.out.println("弹出元素值:" + result);
for (Integer item : queue) {
System.out.println(item);
}
result = queue.dequeue();
System.out.println("队列里元素个数:" + queue.size());
System.out.println("弹出元素值:" + result);
for (Integer item : queue) {
System.out.println(item);
}
}
}
运行结果:
==============入队列测试==============
队列里元素个数:5
队列里的数据:
1
2
3
4
5
====================出队列测试=====================
队列里元素个数:4
弹出元素值:1
2
3
4
5
队列里元素个数:3
弹出元素值:2
3
4
5
图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小。图像梯度计算需要求导数,但是图像梯度一般通过计算像素值的差来得到梯度的近似值(近似导数值)。本节主要介绍Sobel算子、Scharr算子、Laplacian算子和Canny算子的使用.
图标组件是展示图标的组件,但是再Flutter中,Icon组件是只是起一个展示效果,不能进行交互,如果要实现交互,就需要使用图标按钮IconButton组件。
网页扫描二维码库:Html5-Qrcode,官网地址:https://scanapp.org/html5-qrcode-docs/
《康熙王朝》是一部非常优秀的电视连续剧,陈道明演的康熙是我觉得最有帝王气魄,让人意犹未尽,本文主要记录一小段非常经典的对白。
快速生成表格
Electron页面跳转、浏览器打开链接和打开新窗口
Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题
在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。