前面学习了数组,接下来来研究数据结构中非常重要的一部分——栈。
栈的基础知识
栈的特征
栈和队列是比较特殊的线性表,又称为访问受限的线性表。栈式很多表达式、符号等运算的基础,也是递归的底层实现。理论上,递归能做的题用栈都可以来解决。
栈底层实现仍是链表或者顺序表,栈与线性表最大区别是数据的存取操作受限,栈只能在线性表一段进行,其中的元素先入后出。若栈中没有元素,则称为空栈。
栈的操作
栈常用的操作有:
push():增加一个元素
pop():弹出一个元素
peek():现实栈顶元素,但不出栈
empty():判断栈是否为空
基于链表实现栈
链表可以实现栈,插入和删除都在头节点进行就可以了。
入栈
首先要判断进入栈的元素是否为空,先判断栈是否为空,若为空,将入栈的第一个元素作为top,如果不为空就按照链表头插法进入栈。
public void push(T t){
if (t == null){
throw new NullPointerException("参数不能为空");
}
if (head == null){
head = new Node<T>();
head.t = t;
head.next = null;
}else {
Node<T> temp = head;
head = new Node<>();
head.t = t;
head.next = temp;
}
}
出栈
判断栈是否为空,若空则返回空值,若不为空,就将头节点指定第一个节点的下一个节点,返回第一个节点,就是出栈的元素。
public T pop(){
if (head == null){
return null;
}
T t = head.t;
head = head.next;
return t;
}
取栈顶元素
判断栈是否为空,若空则返回空值,若不为空,拿到第一个节点并返回。
public T peek(){
if (head == null){
return null;
}
T t = head.t;
return t;
}
判断栈空
判断栈是否为空,只需要判断head是否为空,若空返回true,否则返回false。
public boolean isEmpty(){
if (head == null){
return true;
}else {
return false;
}
}