Java数据结构--自定义栈

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。其中关系是指数据元素之间的逻辑关系,即逻辑结构。

数据结构和算法是计算机科学的两大支柱,是程序设计的基础。

例如栈,只有先了解了它的结构、原理才能更好的使用它去编程

栈是限定仅在表尾进行插入或删除操作的线性表。表尾端称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈

栈的特性是先进后出(FILO),后进先出(LIFO)


我用了两种方法定义栈,数组和链式结构


数组---栈是长度可变的,而数组的长度是定长的,所以就可以运用自定义的长度可变数组来做(详细看我的上一篇)

        每次数据入栈时,数据直接加到数组的尾部,数据出栈时,直接删除数组的最后一个数据

public class MyStack<E> {
	private int num;//栈中数据的数量
	private int rongliang;
	private int zengliang;
	
	//定义一个原数组
	//用E是后面会出错,而Object类包含所有的类型,所以定义数组是用Object类
	private Object[] src;
		
	//三个不同的构造方法
	public MyStack(){
		this(10,10);
	}
		
	public MyStack(int rongliang){
		this(rongliang,10);
	}
		
	public MyStack(int rongliang,int zengliang){
		this.rongliang = rongliang;
		this.zengliang = zengliang;
		src = new Object[rongliang];
	}
		
	
	//将数据压入栈中
    public void push(E e){
    	if(num>=src.length){
    		Object[] arr = new Object[src.length+zengliang];
    		System.arraycopy(src, 0, arr, 0, num);
    		src = arr;
    	}
    	src[num++] = e;
	}
		
	//查看栈顶的数据
	public E get(){
		return (E) src[num-1];
	}
		
	//弹出栈顶的数据
	public E pop(){
		System.arraycopy(src, 0, src, 0, num-1);
		num--;
		return (E)src[num];
	}
		
	// 判断栈是否为空
	public boolean isEmpty() {
		return src.length == 0;
	}
	
	//获得栈的大小
	public int size(){
		return num;
	}

}

链式结构--栈的长度可变,链表的长度也可变

        放入数据时,直接将新放入的数据作为链表的头,将原先放进去的向后移,而且删除数据时,删除链表的头部会更容易,所以入栈放数据时,倒着放进去,即将链表的头当做栈的尾端(即栈顶)


public class MyStack<E> {

	// 定义一个长度是0的链表
	Node top = null;
	int num;// 结点个数

	// 将数据压入栈中
	public void push(E e) {
		// 创建结点对象
		Node n = new Node(e);
		// 每次都将新的结点作为新的头结点
		n.next = top;
		top = n;
		num++;
	}

	// 查看栈顶的数据
	public E get() {
		return top == null ? null : top.e;
	}

	// 弹出栈顶的数据
	public E poll() {
		if (top == null) {
			return null;
		}
		// 如果头结点存在,就取出并移除头结点
		Node n = top;
		top = n.next;
		n.next = null;
		num--;
		return n.e;
	}

	// 判断栈是否为空
	public boolean isEmpty() {
		return num == 0;
	}
	
	//获得栈的大小
	public int size(){
		return num;
	}

	// 链式结构的结点类
	private class Node {
		E e;
		Node next;

		public Node(E e) {
			this.e = e;
		}

	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值