数据结构——栈的java实现(一)-使用顺序存储结构(数组)以及实现

一、线性表的定义

线性表是同一类型数据的一个有限序列,线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。

线性表的顺序存储要求地址空间是连续的,地址必须一个接一个,不能中断。如下图为顺序存储结构:
在这里插入图片描述

二、顺序存储结构

线性表顺序存储每个节点只包含数据部分,不需要额外包含数据之间的关系,因为数据之间的关系通过地址连续来体现,所以非常省空间

它的优点访问非常快速,因为地址是连续的,只要知道首地址,任意一个元素的地址都可以算出来。假设每个地址占c个空间,则第i个地址为(i-1)*c。

它的缺点是在插入和删除数据时,可能要移动许多数据,比如一个10000个元素的有序数据,如果我删除了第二个元素,为了继续保持地址连续,所以要把后面9999个元素都向前移动。

三、栈的定义

栈(stack)是限定仅在表尾进行插入和删除操作的线性表

我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)

栈又称作后进先出线性表——Last In First Out(LIFO)

注意:栈是一个被限制的线性表,不提供从中间任何位置删除、插入、访问元素的方法。也就是说栈只能够在栈顶插入和删除元素

栈来自与线性表,因此可以使用顺序表的方式来实现也可以使用链表的方式来实现。
在这里插入图片描述
系统栈记录中断的点,调用完其他方法后继续运行
在这里插入图片描述

代码:

Array.class

package code.ArrayCode;

public class Array<E> {
   

    private E[] data;
    private int size;

    /*
     * 构造函数,传入数据的容量capacity构造Array
     * */
    public Array(int capacity){
   
        data = (E[])new Object[capacity];
        size = 0;
    }

    //无参数的构造函数,默认数据的容量capacity=10
    public Array(){
   
        this(10);
    }

    //获取数组中的元素个数
    public int getSize(){
   
        return size;
    }

    //获取数组的容量
    public int getCapacity(){
   
        return data.length;
    }

    //返回数组是否为空
    public boolean isEmpty(){
   
        return size==0;
    }
    //在最后一位添加数据
    public void addLast(E e){
   
        add(size,e);
    }
    //在开头添加数据
    public void addFirst(E e){
   
        add(0,e);
    }

    public void add(int index , E e){
   

        //判断index是不是合法的
        // 如果index为负数则不合法
        // 如果index > size则说明数组中间有空余的位置,并非紧密排列
        if(index < 0 || index > size){
   
            throw new IllegalArgumentException("Add failed. Require index >= 0 || index <= size.");
        }
        //判断数组满了没有
        if(size == data.length){
   
            resize(2 * data.length);
        }

        //从最后一位开始移位,当i=index的时候,index位置上还是有原来位置的数据,
        //只不过index和index+1这两个位置的数据一样,原来index位置上的值复制到了index+1
        //所以我们可以放心的用新数据覆盖掉index位置上的值
        for(int i = size -1 ; i >= index ; i--){
   
            data[i+1] = data[i];
        }
        //用新值覆盖原index位置上的值
        data[index] = e;
        size++;
    }

    //取出索引为index的这个元素
    //通过get方法是无法获取没有值的索引
    E get(int index){
   
    
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值