序言
数据结构,可以理解为算法基础
1.数据结构示意图
2.队列
- 特点
是先进先出,就像排队一样,队尾进队头出 - 图示
- Queue的方法
- 生产
add、offer、put这3个方法都是往队列尾部添加元素,区别如下:
add:不会阻塞,添加成功时返回true,不响应中断,当队列已满导致添加失败时抛出IllegalStateException。
offer:不会阻塞,添加成功时返回true,因队列已满导致添加失败时返回false,不响应中断。
put:会阻塞会响应中断。 - 消费
take、poll方法能获取队列头部第1个元素,区别如下:
take:会响应中断,会一直阻塞直到取得元素或当前线程中断。
poll:会响应中断,会阻塞,阻塞时间参照方法里参数timeout.timeUnit,当阻塞时间到了还没取得元素会返回null
3.栈
- 定义
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。先进后出 - 图示
- 仿写堆栈案例
import java.util.Arrays;
public class MyStack {
public int[] elem; //数组 -> 栈空间
public int usedSize;//有效数据
public MyStack(){
this.elem = new int[5];
this.usedSize = 0;
}
//入栈
public void push(int val){
//如果栈满了就进行扩容
if(isFull()){
this.elem = Arrays.copyOf(elem,2*this.elem.length);
}
this.elem[this.usedSize] = val;
usedSize++;
}
//判断栈是否满
public boolean isFull(){
return usedSize==this.elem.length;
}
//出栈
public int pop(){
if(isEmpty()){
throw new NullPointerException("栈为空!");
}
int oldVal = this.elem[usedSize-1];
this.usedSize--;
return oldVal;
}
//判断栈是否为空
public boolean isEmpty(){
return this.usedSize==0;
}
//读取栈顶元素
public int peek(){
if(isEmpty()){
throw new NullPointerException("栈为空!");
}
return this.elem[usedSize-1];
}
}
4.数组