栈的基本知识介绍与手动实现
我们都知道 Java 里面其实已经实现了栈结构,使用 Stack stack = new Stack<>(); 就可以创建出一个堆栈。但是如果希望手动实现一个简单的堆栈,你定义一个链表节点,节点里面包含数据,以及下一个节点的引用,定义方法如下:
public class MyStack<T> {
// 定义链表节点
class Node<T> {
// 节点数值
private T t;
// 下一个节点
private Node next;
}
// 头节点
private Node<T> head;
// 构造函数
MyStack() {
// 初始化头节点
head = null;
}
// 压入栈
public void push(T t) {
if (t == null) {
throw new NullPointerException("参数不能为null");
}
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) {
throw new NullPointerException("堆栈里面没有元素");
}
T t = head.t;
head = head.next;
return t;
}
// 栈顶元素
public T peek() {
if (head == null) {
throw new NullPointerException("堆栈里面没有元素");
}
T t = head.t;
return t;
}
// 栈是不是为空
public boolean isEmpty() {
if (head == null) return true; else return false;
}
}
使用两个栈实现队列
import java.util.Stack;
class Myqueue {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
// 加入数据全部压入 stack1
public void push(int node) {
stack1.push(node);
}
// 弹出数据
public int pop() {
if (!stack2.isEmpty()) {
// stack2 不为空,则直接取出 stack2 的数据
return stack2.pop();
} else {
// 将 stack1 的数据全部倒入 stack2
while (!stack1.isEmpty