线性表之队列(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
最近关注流媒体服务器来做网络直播,本想使用阿里云的流媒体服务器,由于费用的问题还是想能否自己搭建一个流媒体服务器供自己测试使用。果不其然,Nginx居然如此强大,可以用来做流媒体服务器。本文将具体介绍流媒体服务器的搭建过程和使用过程。
《是妈妈是女儿》聚焦母女间未曾言明的爱意,以书信对话的形式呈现出各自的内心独白,表达彼此的牵挂。黄绮珊与希林娜依·高用跨越时空、打开心扉、深情对唱的形式,将天下母女爱的寄语化作心灵的倾诉。黄绮珊的每一句话,每一个字都演绎出了妈妈对女儿的爱,而希林依娜·高把女儿对妈妈的爱由不理解到理解再到感恩演绎得淋漓尽致。
which命令用户显示命令的全路径。which命令查找的范围是PATH环境变量的路径
ScrollUp 是一个轻量级的 jQuery 插件,用于创建可轻松用于任何网站的可自定义的“滚动到顶部”功能。
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
快速生成表格
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的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。