java数据结构之栈的实现

一、栈的相关概念

栈(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;
		} 
	}
}

猜你喜欢

转载自blog.csdn.net/Hicodden/article/details/105945808