一、栈的相关概念
栈(Stack):是限定只在队尾进行插入或操作的线性表。因此表的尾端称为栈顶,表头段称为栈底,不含任何元素的时候称之为空栈。
用数组实现栈
特点:先进先出(First In Last Out,即FILO)
基本操作:
- 操作1:初始化
- 操作2:清空栈
- 操作3:获取栈长度
- 操作4:判断是否为空
- 操作5:获取栈顶的元素,但不出栈
- 操作6:入栈(push),即将数据压入栈顶
- 操作7:出栈(pop),将栈顶的元素删除并返回
- 操作8:遍历栈中的数据
栈的实现由两种,一是顺序栈,即用数组实现;而是链表栈。
二、栈的实现
1、顺序栈的实现
public class ArrayStack<T>{
//队列的默认容量是10
private int DEFAULT_CAPACITY = 10;
// 空栈的声明
private final Object[] EMPTY_STACK ={
};
// 栈的容量
private int capacity;
// 栈顶的指针
private int top;
private Object[] stack;
// 操作1:初始化,这里使用构造函数来初始化栈
public ArrayStack(){
stack = new Object[DEFAULT_CAPACITY];
this.capacity = DEFAULT_CAPACITY ;
this.top= 0;
}
// 操作1.2:初始化,这里使用构造函数来初始化栈
public ArrayStack(int capacity ){
stack = new Object[capacity];
this.capacity = DEFAULT_CAPACITY ;
this.top= 0;
}
// 操作2:清空栈
public void clear(){
this.stack = EMPTY_STACK ;
top=0;
}
// 操作3:获取栈长度
public int size(){
return top;
}
// 操作4:判断是否为空
public boolean isEmpyt(){
return top == 0 ;
}
// 操作5:获取栈顶的元素,但不出栈
public Object getTop(){
if(isEmpty()){
throw new RuntimeException("栈为空,不能执行出栈操作");
}
return stack[top-1];
}
// 操作6:入栈(push),即将数据压入栈顶
public void push(T data){
if(isFull){
throw new RuntimeException("栈满,无法执行入栈操作");
}
stack[top] = data;
top++;
}
// 操作7:出栈(pop),将栈顶的元素删除并返回
public T pop(){
if(isEmpty()){
throw new RuntimeException("栈为空,不能执行出栈操作");
}
/*
这里的stack.[--top]相等于
top--;
return data = stack[top];
*/
return stack[--top];
}
//操作8:用数组实现栈多了一个是否判断栈的操作
public boolean isFull(){
return top == capacity;
}
}
2、链表栈的实现
public class LinkStack<T>{
// 头节点
private LinkNode<T> head; // 该节点不存放数据
// 操作1:初始化,利用构造方法去初始化栈
public LinkStack(){
this.head = new LinkNode();
head.next = null;
head.data = null;
}
// 操作2:清空栈,将链表的next 设置为空就可以了
public void clear(){
this.head.next = null;
}
// 操作3:获取栈长度
public int size(){
int size=0;
LinkNode<T> temp = head;
while(temp.next !=null){
size ++ ;
temp = temp.next;
}
return size;
}
// 操作4:判断是否为空
public boolean isEmpty(){
return head.next == null;
}
// 操作5:获取栈顶的元素,但不出栈
public T getTop(){
//先判断栈是否为空,如果为空,就抛出异常
if(isEmpty()){
System.out.println("栈为空,无法获取栈顶的元素");
throw new RuntimeException("栈为空");
}
return head.data.
}
// 操作6:入栈(push),即将数据压入栈顶
// 每次插入都是插入到头节点head之后,
public void push(T data){
// 创建一个新的LinkNode,用于插入
LinkNode<T> insertNode = new LinkNode(data);
insertNode.next = head.next;
head.next =temp;
}
// 操作7:出栈(pop),将栈顶的元素删除并返回
public T pop(){
if(isEmpty()){
throw new RuntimeException("栈为空,无法进行出栈操作");
}
LinkNode<T> delNode = this.head.next;
this.head = delNode.next;
return delNode.date;
}
//链表栈中的节点
private class LinkNode<T>{
// 数据的类型
public T data;
// 下一个节点的数据
public LinkNode next;
// 构造方法
public LinkNode(){
}
public LinkNode(T data){
this.date = data;
}
}
}