线性表之队列(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
Electron页面跳转、浏览器打开链接和打开新窗口
Golang打包一般的静态资源文件到二进制文件中还是比较简单,但是如果遇到使用Vue编写的后台界面,该如何打包呢?本文就是记录如何打包Vue到二进制包
在Golang编程中,经常会用到MongoDB数据库进行查询,但是当日期是一个字符串的时候,如何根据日期进行分组查询呢?本文将记录如何分组查询统计。
在使用Golang开发项目的过程中,我们会使用很多外部包,但是我们一般通过go get获取相应包后,都下载到了GOPATH对应的路径下。这样造成了我们不能将多个项目的依赖隔离开,其次就是多个人协同开发一个项目后,每个人下载的包有可能不一致,所以通过这种方式也可以得到解决。
用supervisord管理python进程,python程序中的print内容不能输出到指定的日志文件
快速生成表格
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。
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,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。