栈
通过动态数组实现栈
栈是一种只能在表头进行插入和删除,即先进后出的线性结构。在Java中有定义好的Stack类,位于java.util包下。下面介绍两种自定义栈结构的方式。
public class DynArrayStack<T> {
/**
* 通过动态数组来实现栈
* 1、capacity为数组容量
* 2、定义数组初始容量为10,当栈满后数组容量变为原数组的1.5倍
*/
private int top = -1; // 栈顶所在位置
private int capacity = 10;
private Object[] arr = new Object[capacity];
public boolean isEmpty(){ //判断栈是否为空
return top == -1;
}
public void push(T data){ //将元素压入栈
if(top == capacity - 1){ // 当栈满时,数组扩容
capacity += capacity/2; // 容量变为原来的1.5倍
Object[] newarr = new Object[capacity];
System.arraycopy(arr, 0, newarr, 0, arr.length); // 将arr中的元素复制到newarr
arr = newarr;
}
arr[++top] = data;
}
@SuppressWarnings("unchecked")
public T pop(){ //栈顶元素出栈
if(isEmpty())
throw new ArrayIndexOutOfBoundsException(); // 如果栈为空,抛出异常
return (T)arr[top--];
}
@SuppressWarnings("unchecked")
public T getTop(){ // 获取栈顶元素,不用出栈
if(isEmpty())
throw new ArrayIndexOutOfBoundsException();
return (T)arr[top];
}
public void clear(){ // 清空栈
top = -1;
}
public int size(){ // 返回栈中元素个数
return top+1;
}
}
通过链表实现
import java.util.EmptyStackException;
import linkedlist.ListNode;
public class LLStack<T> {
/**
* 通过链表实现栈
* 1、通过在链表表头不断插入的方式实现push操作
* 2、删除表头结点实现pop操作
*/
private ListNode<T> headNode = new ListNode<T>(null);
private int size = 0; // 栈中元素个数
public void push(T data){ // 入栈
if(headNode == null){//头结点不存在,即栈为空时
headNode = new ListNode<T>(data);
} else if(headNode.getData() == null){ //头结点数据为null,即第一次向栈中加元素
headNode.setData(data);
} else {
ListNode<T> node = new ListNode<T>(data);
node.setNext(headNode);
headNode = node;
}
size++;
}
public T getTop(){ // 获取栈顶元素
if(headNode == null)
throw new EmptyStackException();
else
return headNode.getData();
}
public T pop(){ // 出栈
if(headNode == null){
throw new EmptyStackException();
} else {
T data = headNode.getData();
headNode = headNode.getNext();
size--;
return data;
}
}
public boolean isEmpty(){ // 判断栈是否为空
if(headNode == null) // 表头结点不存在
return true;
else if(headNode.getData() == null) //表头结点数据域为null
return true;
else
return false;
}
public int size(){ // 返回栈中元素个数
return size;
}
}

浙公网安备 33010602011771号