一、什么是栈
在讲解如果基于数组和链表实现栈之前,我们要先了解栈。
Java的util包就提供了stack类,常见操作有这些。
- push(E):增加一个元素E
- pop0:弹出元素E
- peek0:显示栈顶元素,但是不出栈
- empty0:判断栈是否为空
二、基于数组实现栈
将栈的出入当作数组元素存入和去除并删除,还需要考虑到数组是有长度限制的,所以我们要在入栈前判断是否需要扩容。
import java.util.Arrays;
public class MyStack<T> {
private Object[] stack;
private int top;
//初始化栈,容量为10
MyStack() {
stack = new Object[10];
}
//判断栈是否为空
public boolean isEmpty() {
return top == 0;
}
//显示栈顶元素但不出栈
public T peek() {
T t = null;
if (top > 0) {
t = (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) {
size = size * 3 / 2 + 1;
stack = Arrays.copyOf(stack, size);
}
}
}
三、基于链表实现栈
基于链表实现栈就是将新元素添加在表头,那么在遍历的的时候就会将后放入的节点取出来。
import java.util.Arrays;
public class MyStack<T> {
class Node<T>(){
public T t;
public Node next;
}
public Node<T> head;
MyStack(){
head = null;
}
//入栈
public void push(T t){
if (t == null){
System.out.println("参数为空");
}
if (head ==null){
head = new Node<>();
head.t = t;
head.next = null;
}else{
Node<T> temp = head;
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;
}
}
}