1. 栈基础知识
1.1 栈的特征
栈的底层实现是顺序表或链表,只允许在一端进行插入和删除操作。允许操作的一段叫做栈顶 (Top),不允许操作的一段叫做栈底 (Buttom), 插入元素的操作称为入栈(push),删除元素的操作叫做出栈(pop)
1.2 栈的操作
- push(E):栈顶新增一个元素
- pop():栈顶弹出元素
- peek():显示栈顶元素,但不弹出
- empty():判断栈是否为空
1.3 Java中的栈
public class Test {
public static void main(String[] args) {
Stack<Integer> stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println("栈顶元素为:" + stack.peek());
System.out.println("出栈:" + stack.pop());
}
}
1.4 自己实现栈
基于数组实现栈
class MyStack<T> {
// 储存栈元素的数组
private T[] stack;
// 栈顶元素
private int top;
MyStack() {
// 无参构造,默认初始容量为10
stack = new T[10];
}
// 判断是否为空
public boolean isEmpty() {
return top == 0;
}
// 获取栈顶元素
public T peek() {
T t = null;
if(top > 0) {
t = stack[top - 1];
}
return t;
}
// 添加元素
public void push(T t) {
expandCapacity(top + 1);
stack[top] = t;
top++;
}
// 出栈
public T pop() {
T t = peek();
if(top > 0) {
stack[top - 1] = null;
top--;
}
return t;
}
// 扩大容量
public void expandCapacity(int size) {
int len = stack.length;
if(size > len) {
// 每次扩容50%
size = size * 3 / 2 + 1;
stack = Arrays.copyOf(stack, size);
}
}
}
基于链表实现栈
class ListStack<T> {
//定义链表
class Node<T> {
public T t;
public Node next;
}
public Node<T> head;
//构造函数初始化头指针
ListStack() {
head = null;
}
//入栈
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;
}
//栈空
public boolean isEmpty() {
if (head == null)
return true;
else
return false;
}
}