数据结构:队列
解释:是一种特殊的线性表
原则:在线性表上添加限制,具有先进先出的规则
分为两种:
- 顺序队列:依赖数组来实现,其中的数据在内存中也是顺序存储。(可使用循环队列的数据操作,避免数组越界的问题,同时可用标识来区别数据是空还是满)
(front删除 rear新增, rear指向最新元素的下一个位置) - 链式队列:依赖链表来实现,其中的数据依赖每个结点的指针互联,在内存中并不是顺序存储。链式队列,实际上就是只能尾进头出的线性表的单链表
(rear新增s front 指针指向头结点。头结点不存储数据,只是用来辅助标识。)
例子:约瑟夫环问题(链式队列)
package com.bai.webflux.webfluxdemo.test;
import java.util.LinkedList;
public class StringTest {
// n 个人和数到 m 的出列(杀死)的人
public static void main(String[] args) {
ring(10, 5);
}
public static void ring(int n, int m) {
LinkedList<Integer> q = new LinkedList<Integer>();
for (int i = 1; i <= n; i++) {
q.add(i);
}
//队列数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
int k = 2;
int element = 0;
int i = 0;
for (; i<k; i++) {
element = q.poll();
q.add(element);
}
//前边这几步,,只是打乱了一下顺序而已[3, 4, 5, 6, 7, 8, 9, 10, 1, 2]
i = 1;
while (q.size() > 0) {
element = q.poll();
if (i < m) {
q.add(element);
i++;
} else {
i = 1;
System.out.println(element);
}
}
}
}