📚 目录
1. 认识栈
栈:我们能看作一个水杯,水杯里面装着水(就相当于水杯中装的是我们想要存储的值)。
概念:
特殊线性表,只允许在一端插入或者删除元素。

特殊性:先进的元素后出。(插入:入栈;删除:出栈)
Java官方提供的相关栈(Stack)操作:

[🔙 返回目录](#🔙 返回目录)
2. 模拟实现栈
java
public class MyStack<E> {
public Object[] array;
//栈中真实元素的大小
public int size;
//初始化数组长度为5
public MyStack() {
array = new Object[5];
}
}
栈的模拟我们使用数组来实现。
入栈

添加时需要判断当前的数组是否满了,满了就需要进行扩容。
java
//入栈
public E push(E val) {
//判断当前栈是否满,满了就需要扩容
if(size==array.length) {
array = Arrays.copyOf(array,2*array.length);
}
array[size++] = val;
return val;
}
结果:

出栈

java
//出栈
public E pop() {
//判断是否为空
if(empty()) {
throw new RuntimeException("栈为空");
}
E val = (E)array[size-1];
size--;
return val;
}
结果:

获取栈顶元素
首先判断当前栈是否为空,如果不为空直接返回size-1下标位置的元素。
java
//获取栈顶元素
public E peek() {
if(empty()) {
throw new RuntimeException("栈为空");
}
return (E)array[size-1];
}
结果:

判断栈是否为空
此时只需要判断size的个数是否为0,即可:
java
public boolean empty() {
return size == 0;
}
结果:

[🔙 返回目录](#🔙 返回目录)
3. 认识队列
队列:我们能将队列想象成一个倒着的水杯。
为什么要看出倒着的水杯?
倒着的水杯无论你加多少滴水进去,都是第一个进去的水滴先掉出来。
概念:
一种特殊的线性表,一端进行插入,一段进行删除的特殊线性表。

特殊性:先进先出。
Java官方提供的队列相关操作:

[🔙 返回目录](#🔙 返回目录)
4. 模拟实现队列
模拟队列的实现我们采用链表的形式来模拟实现。
java
public class MyQueue <E>{
//创建节点
static class ListNode<E> {
public ListNode<E> next;//前一个节点
public ListNode<E> prev;//后一个节点
public E val;//存储的值
public ListNode(E val) {
this.val = val;
}
}
ListNode<E> first;//队头
ListNode<E> last;//队尾
public int size;//大小
}
入队

每次插入都在队尾进行插入,第一次插入时需要额外的判断。
java
//入队
public void offer(E e) {
ListNode<E> listNode = new ListNode<>(e);
//判断队列是否为第一次添加数据
if(first==null) {
first = listNode;
}else {
last.next = listNode;
listNode.prev = last;
}
//让尾巴节点移动
last = listNode;
size++;
}
结果:

出队

java
//出队
public E poll() {
//判断队列是否为空
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
E val = first.val;
//判断队首和队尾是否相等
if(first == last) {
first = null;
last = null;
}else {
first = first.next;
first.prev.next = null;
first.prev = null;
}
//长度减小
size--;
//返回要删除的值
return val;
}
结果:

获取队头元素
和栈类似,都需要判断当前的队列是否为空。
java
//获取队头元素不删除
public E peek() {
//如果队列为空则报异常
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
//返回队列的元素
return first.val;
}
结果:

判断队列是否为空
直接判断first是否为空,或者判断size大小是否为0。
java
public boolean isEmpty() {
return first == null;
}
结果:

[🔙 返回目录](#🔙 返回目录)