线性数据结构
数据结构
线性结构
数组(顺序存储)
使用一组连续的存储空间
数组的插入以及删除操作是低效的
假设数组的长度为n插入数据的位置为i,则要将i~n的数据全部向后移动,效率偏低,删除操作同理。
稀疏数组
当二维数组中只存放了少量数据的时候,可以考虑采用稀疏数组来减少空间的使用
-
记录二维数组中的有效数据个数记作n
-
记录每个有效数据的坐标
-
创建[n+1] [3]大小的稀疏数组(第一行记录原数组大小以及有效数据,其余行记录有效数据坐标以及值)
-
根据稀疏数组还原二维数组
链表(链式存储)
使用不连续的内存空间动态的存储数据
单向链表(包含头节点和不包含头节点的,视情况而定),本文为包含头节点
前奏:定义一个节点,包含数据域和指针域(链接下一个节点--next)
定义一个单向链表,包含一个头节点(无任何实际作用,仅作标识)
增加节点
-
因为头节点无法移动所以借助辅助节点指向头节点(Help节点)
-
直接插入:插入条件(当Help节点的下一个节点为空时,让Help节点的next指向插入的节点)
-
按序插入:插入条件(当Help节点的下一个节点序号大于插入节点的序号时,让插入节点的next指向Help节点的next,Help节点的next指向插入节点)
-
当条件不满足时,让Help节点等于Help的下一个节点
修改节点
-
让Help节点指向头节点的下一个节点
-
修改条件(当Help节点的序号的等于修改节点的序号时)
-
修改节点数据
-
当条件不满足时,让Help节点等于Help的下一个节点
删除节点
-
让Help节点指向头节点的下一个节点
-
删除条件(Help节点的下一个节点序号等于删除节点的序号)让Help节点的next指向待删除节点的next
-
当条件不满足时,让Help节点等于Help的下一个节点
遍历链表
-
定义Help节点指向头节点的下一个节点
-
结束条件(Help节点的下一个节点为空)
-
循环打印
双向链表
| 单向链表 | 双向链表 |
|---|---|
| data,next指针 | data,next,pre指针 |
| 只能从前往后遍历链表 | 能够双向遍历链表 |
| 不能自我删除节点 | 能够自我删除节点 |
前奏:定义一个节点,包含数据域和指针域(链接下一个节点--next和上一个节点--pre)
定义一个双向链表,包含一个头节点(无任何实际作用,仅作标识)
增加节点
-
因为头节点无法移动所以借助辅助节点指向头节点(Help节点)
-
直接插入:插入条件(当Help节点的下一个节点为空时,让Help节点的next指向插入的节点,插入节点的pre指向Help节点)
-
按序插入:插入条件(当Help节点的下一个节点序号大于插入节点的序号时,让插入节点的next指向Help节点的next,Help节点的next指向插入节点,插入节点的pre指向Help节点的next的pre,Help节点的next的pre指向插入节点)
-
当条件不满足时,让Help节点等于Help的下一个节点
修改节点
-
让Help节点指向头节点的下一个节点
-
修改条件(当Help节点的序号的等于修改节点的序号时)
-
修改节点数据
-
当条件不满足时,让Help节点等于Help的下一个节点
删除节点
-
让Help节点指向头节点的下一个节点
-
删除条件(Help节点序号等于删除节点的序号)Help节点的pre的next指向Help节点的next,Help节点的next的pre指向Help节点的pre(此处要判断Help节点的next是否为空,防止删除最后一个节点时空指针)
-
当条件不满足时,让Help节点等于Help的下一个节点
遍历链表
-
定义Help节点指向头节点的下一个节点
-
结束条件(Help节点的下一个节点为空)
-
循环打印
josephu(约瑟夫问题)
题目描述:有n个小孩围成一圈,从第i个小孩开始报数,数到s的小孩出队,得到出队的顺序

队列
特点:先进先出
使用数组模拟队列

栈
特点时先进后出
应用场景
-
子程序调用时,先将下个指令的地址存储在堆栈中,方便执行完子程序后回到原来程序中
-
递归调用,和子程序调用相同,不同点在于会将参数和区域变量存储在堆栈中
-
表达式的转换(中缀表达式转后缀表达式)
-
二叉数的遍历
-
图的深度优先遍历算法
使用链表模拟栈
public class LinkedStack
{
public static void main(String[] args)
{
LStack stack=new LStack();
Scanner sc=new Scanner(System.in);
String choice;
boolean loop=true;
while(loop) {
System.out.println("输入push添加数据");
System.out.println("输入pop弹出数据");
System.out.println("输入peek查看栈顶数据");
System.out.println("输入show查看数据");
System.out.println("输入e推出");
choice=sc.next();
switch(choice) {
case "push":
System.out.println("请输入数据");
int value=sc.nextInt();
stack.push(value);
break;
case "pop":
stack.pop();
break;
case "peek":
stack.peek();
break;
case "show":
stack.show();
break;
case "e":
loop=false;
break;
}
}
}
}
//定义链表节点对象
class Node{
private int value;
private 