栈和队列的代码实现

栈的代码实现

一:概念

1:定义

栈是一种只允许在一段进行插入和删除操作的线性表。

栈是一种先进后出的线性表

2:栈顶

线性表允许插入和删除的一端

3:栈底

固定的,不允许进行插入和删除。

按下图所示,入栈顺序为a,b,c,d;出栈顺序为d,c,b,a

二:栈的实现图例

img

三:代码实现

1:前期准备

定义元素个数
private int num;
定义存元素的数组
private Object[] value;
设置一个默认容量
private static final int DEFAULT_CAPACITY = 10;
设置一个无参构造,调用方法,该方法定义了默认容量的应用和不符合默认容量时该怎么做。
上面的方法调用下面的方法
public MyStack(){
   this(DEFAULT_CAPACITY);
}
​
public MyStack(int capacity){
    if(capacity < 0){   //如果后面new的元素个数小于0时,就设置为默认容量。
       capacity = DEFAULT_CAPACITY;
    }
    value = new Object[value];
}

2:入栈

         /**
         * 将元素压入栈顶
         * 入栈
         * @param element 要压入的元素
         * 还需要考虑是否需要扩容。
         */
        void push(Object element){
            if(num + 1 > value.length){
            grow();       //扩容
            }
            value[num] = element;
            num ++;
        
        }

3:扩容方法

private void grow(){
     int oldCapacity = value.length;
     int newCapacity = oldCapacity << 1;   //翻倍扩容
     if(newCapacity < oldCapacity){
         newCapacity = Integer.MAX.VALUE;    //自己犯错点:这一步是给新的数组长度赋值为int的最大长度
     }
     
     value = Arrays.copyOf(value,newCapacity);  //Array.copyOf里面添加的是数组名以及长度,System.arrayCope()在应用时需要定义一个新的数组,然后里面添加的依次是(旧数组名称,起始位置,新数组名称,起始位置,复制长度)
     
}

4:出栈

/**
         * 弹出栈顶元素并返回
         * 把栈顶元素删除,并返回
         * 出栈
         * @return 弹出的栈顶元素, 如果栈为空返回 null
         */
       Object pop(){
            Object element = value[num - 1];   //栈顶元素
            value[num - 1] = null;
            length --;
            return element;
       }

5:返回栈顶元素

/**
         * 返回栈顶元素,但不弹出
         * @return 栈顶元素
         */
      Object peek(){
        return value.length - 1;
      }

6:检查栈是否为空

/**
         * 检查栈是否为空
         * @return 如果栈为空则返回true,否则返回false
         */
       boolean isEmpty(){
        return num == 0;
       }

7:返回栈中元素个数

int size(){
    return num;
}

8:最后以数组的形式进行输出

public String toSrtring(){
    StringBuilder sb = new StringBuilder();
    sb.append("[");
    for(i = 0; i < num-1;i ++){
        sb.append(value[i] + ",");
    }
    sb.append(value[num - 1]).append("]");
    return.toString();
}

队列的代码实现

一:基本概念

1:队列定义

队列是只允许在一端进行插入操作,而在另外一端进行删除操作的线性表。

队列是一种先进先出的线性表。

2:对头

允许删除的一端。

3:队尾

允许插入的一端。

按下图所示,入队顺序为1,2,3,4

出对顺序为1,2,3,4

二:对列的实现图例

img

三:代码实现

1:前期准备

定义元素个数
private int size;
定义元素数组
private Object[] value;
定义一个默认容量
private static final int DEFAULT_CAPACITY = 10;
​
public MyEqeue(){
    this(DEFAULT_CAPACITY);
}
public MyEqeue(int capacity){
    if(capacity < 0){
        capacity = DEFAULT_CAPACITY;
    }
    value = new Object[capaciyt]; 
}

2:入队

/**
     * 将元素插入队尾
     * @param element 要插入的元素
     */
    abstract void push(Object element){
        if(size + 1 > value.length){
            grow();
        }
        value[size] = element;
        size ++;
    }

3:扩容

private void grow(){
    int old = value.length;   //原长度为数组长度
    int newCapacity = old + 10;   //定长扩容
    if(newCapacity < old){
        nweCapacity = Intager.MAX_VALUE;
    }
    value = Arrays.CopyOf(value,newCapacity);   //注意长度为新的长度
}

4:出队

/**
     * 移除并返回队首元素
     * 删除第一个元素,并返回
     * @return 队首元素, 如果队列为空时,返回 null
     */
    abstract Object pop(){
    Object element = value[0];
    value[0] = null;
    System.arraycopy(value,1,value,0,size - 1); // 将删除队首元素后的队列往前移一位。
        value[size - 1] = null;   //把往前移动完的队列最后一个元素置空
        size --;
        return element;
    
    }

5:返回队首元素

/**
     * 返回队首元素,但不移除
     * @return 队首元素
     */
    abstract Object peek(){
        return value[0];
    }

6:检查队列是否为空

/**
     * 检查队列是否为空
     * @return 如果队列为空则返回true,否则返回false
     */
    abstract boolean isEmpty(){
        return size == 0;
    }

和7:返回队列中元素个数

 

 /**
     * 返回队列中的元素个数
     * @return 队列中元素的个数
     */
    abstract int size(){
        return size;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值