数据结构与算法之栈(基于数组)讲解

1,栈是一种后进先出(last in first out)LIFO

2,基于自己实现的数组实现栈,下面是自己实现数组类

package com.dream21th.algorithmicdatastructure.stack;


/**
 * @Auther: hp
 * @Date: 2019/9/7 15:42
 * @Description:
 */
public class MyExtendArray<E> {

    private E[] datas;

    private int size;

    /**
     * 创建有参构造函数,初始化数组容量
     * @param capacity
     */
    public MyExtendArray(int capacity){
        datas=(E[])new Object[capacity];
        size=0;
    }

    /**
     * 构造无参函数,初始化数组容量
     */
    public MyExtendArray(){
        this(10);
    }

    public int getSize(){
        return this.size;
    }

    public boolean isEmpty(){
        return this.size==0;
    }

    /**
     * 在指定索引位置加值
     * @param index
     * @param e
     */
    public void add(int index,E e){
        if(index<0 || index>this.size){
            throw new IllegalArgumentException("index must between 0 and size");
        }
        if(this.size==datas.length){
            resize(2*datas.length);
        }
        for(int position=size-1;position>=index;position--){
            this.datas[position+1]=this.datas[position];
        }
        this.datas[index]=e;
        this.size++;
    }

    private void resize(int newCapacity) {

        E[] newDatas= (E[]) new Object[newCapacity];

        for(int i=0;i<this.datas.length;i++){
            newDatas[i]=this.datas[i];
        }
        this.datas=newDatas;
    }

    /**
     * 在第一个位置加入元素
     * @param e
     */
    public void addFirst(E e){
        this.add(0,e);
    }

    /**
     * 在最后一个位置添加元素
     * @param e
     */
    public void addLast(E e){
        this.add(size,e);
    }

    public E get(int index){
        if(index<0 || index>=this.size){
            throw new IllegalArgumentException("index must between 0 and size");
        }
        return this.datas[index];
    }

    public void set(int index,E e){
        if(index<0 || index>=this.size){
            throw new IllegalArgumentException("index must between 0 and size");
        }
        this.datas[index]=e;
    }

    public boolean contain(E e){
        for(int i=0;i<size;i++){
            if(this.datas[i].equals(e)){
                return true;
            }
        }
        return false;
    }

    public int find(int e){
        for(int i=0;i<size;i++){
            if(this.datas[i].equals(e)){
                return i;
            }
        }
        return -1;
    }

    public E remove(int index){
        if(index<0 || index>=this.size){
            throw new IllegalArgumentException("index must between 0 and size");
        }
        E ret=this.datas[index];
        for(int i=index+1;i<size;i++){
            this.datas[i-1]=this.datas[i];
        }
        size--;
        this.datas[size]=null;
        if(this.size==this.datas.length/2){
            resize(this.datas.length/2);
        }
        return ret;
    }

    public E removeFirst(){
        return remove(0);
    }

    public E removeLast(){
        return remove(size-1);
    }

    public E getLast(){
       return  get(this.size-1);
    }

    public E getFirst(){
        return get(0);
    }

    public int getCapacity(){
        return this.datas.length;
    }
    @Override
    public String toString() {

        StringBuilder builder=new StringBuilder();
        builder.append(String.format("Array: size = %d,capacity = %d \n",this.size,this.datas.length));
        builder.append("[");
        for(int i=0;i<size;i++){
            builder.append(this.datas[i]);
            if(i!=size-1){
                builder.append(",");
            }
        }
        builder.append("]");
        return builder.toString();
    }
}

3,栈的实现

package com.dream21th.algorithmicdatastructure.stack;

/**
 * @Auther: hp
 * @Date: 2019/9/8 10:41
 * @Description:
 */
public interface Stack<E> {

    int getSize();

    boolean isEmpty();

    void push(E e);

    E pop();

    E peek();
}
package com.dream21th.algorithmicdatastructure.stack;

/**
 * @Auther: hp
 * @Date: 2019/9/8 10:55
 * @Description:
 */
public class ArrayStack<E> implements Stack<E> {

    private MyExtendArray<E> myExtendArray;

    public ArrayStack(int capacity){
        myExtendArray=new MyExtendArray<>(capacity);
    }

    public ArrayStack(){
        this(10);
    }
    @Override
    public int getSize() {
        return myExtendArray.getSize();
    }

    @Override
    public boolean isEmpty() {
        return myExtendArray.isEmpty();
    }

    @Override
    public void push(E e) {
        myExtendArray.addLast(e);
    }

    @Override
    public E pop() {
        return myExtendArray.removeLast();
    }

    @Override
    public E peek() {
        return myExtendArray.getLast();
    }

    public int getCapacity(){
        return myExtendArray.getCapacity();
    }

    @Override
    public String toString() {

        StringBuilder builder=new StringBuilder();
        builder.append(String.format("Stack: size = %d, capacity = %d \n",getSize(),getCapacity()));
        builder.append("[");
        for(int i=0;i<getSize();i++){
            builder.append(myExtendArray.get(i));
            if(i!=getSize()-1){
                builder.append(",");
            }
        }
        builder.append("] top");

        return builder.toString();
    }
}

4,时间复杂度分析

由于都是在数据末尾进行操作,进栈和出栈的空间复杂度都是O(n)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dream21st

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值