数据结构基础
程序员文章站
2023-01-13 23:31:21
1.1 数据结构介绍 数据结构:数据用什么样的方式组合在一起。 1.2 常见的数据结构 数据存储的常用结构有:栈、队列、数组、链表和红黑树。 栈: 栈:stack,又称为堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。 简单来说 ......
1.1 数据结构介绍
数据结构:数据用什么样的方式组合在一起。
1.2 常见的数据结构
数据存储的常用结构有:栈、队列、数组、链表和红黑树。
栈:
- 栈:stack,又称为堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。
简单来说:采用该结构的集合,对元素的存取有如下的特点。
- 先进后出(即,存进去的元素,要在它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,
当开枪的时候,先弹出上面的子弹,然后才弹出下面的子弹。
- 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为压栈(push),删除则称为弹栈(pop)
这里需要理解两个名词:
- 压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
public class mystack {
private int[] array;
private int size;
private int top;
public mystack(int size){
this.size = size;
array = new int[size];
top = -1;
}
//压栈
public void push(int value){
if(top < size-1){
array[++top] = value;
}
}
//弹栈
public int pop(){
return array[top--];
}
//获取栈顶数据
public int gettop(){
return array[top];
}
//判断栈是否为空
public boolean isempty(){
return (top == -1);
}
//判断栈是否满了
public boolean isfull(){
return (top == size-1);
}
}
代码测试:
public class test {
public static void main(string[] args) {
mystack stack = new mystack(3);
stack.push(3);
stack.push(2);
stack.push(1);
system.out.println(stack.gettop());
while(!stack.isempty()){
system.out.println(stack.pop());
}
}
}
结果:
我们
红黑树可以通过红色节点和黑色节点尽可能的保证二叉树的平衡,从而来提高效率。
2.1 hashset集合存储数据的结构(哈希表)
什么是哈希表?
在jdk1.8之前,哈希表底层采用数组+链表实现,即使用数组处理冲突,同意hash值的链表都存储在一个数组内。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而jdk1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
简单的来说,哈希表是由数组+链表+红黑树(jdk1.8增加了红黑树部分)实现的,如下图所示。
为了方便理解可以结合一个存储流程图来说明一下:
// 创建自定义学生类
public class student {
private int age;
private string name;
private double score;
public student() {
}
public student(int age, string name, double score) {
this.age = age;
this.name = name;
this.score = score;
}
// 重写equal和hashcode方法,
@override
public boolean equals(object o) {
if (this == o) return true;
if (!(o instanceof student)) return false;
student student = (student) o;
return getage() == student.getage() &&
double.compare(student.getscore(), getscore()) == 0 &&
objects.equals(getname(), student.getname());
}
@override
public int hashcode() {
return objects.hash(getage(), getname(), getscore());
}
// 重写tostring方法
@override
public string tostring() {
return "student{" +
"age=" + age +
", name='" + name + '\'' +
", score=" + score +
'}'+"\n";
}
// get, set 方法省略。
创建测试类:
public class demo15 {
public static void main(string[] args) {
// 创建hashset集合,接收自定义类型数据。
hashset<student> hs = new hashset<>();
student s1 = new student(19,"王小石",99.2);
student s2 = new student(20,"雷纯",99.4);
student s6 = new student(23,"戚少商",99.8);
student s3 = new student(21,"温柔",99.6);
student s4 = new student(22,"白愁飞",99.1);
student s5 = new student(23,"戚少商",99.8);
// 将数据添加到hashset集合当中。
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
hs.add(s5);
hs.add(s6);
system.out.println(hs);
结果:
下一篇: 骁龙780g对比天玑1100哪个值得买