自己实现一个栈结构

明白一个概念:

 栈:是一种特殊的数据结构,特数性在于:栈本身是数组或者链表,常用的是数组

特点:

 LIFO:后进先出

生活场景:叠加盘子,取盘子

2.栈在函数中的调用

package com.redis.algorithm.stack;


/**
 * 栈:一种特殊的数据结构,是数组或者链表
 *
 * @param <Item>
 */
package com.redis.algorithm.stack;

public interface MyStack<Item> {

    MyStack<Item> push(Item item);   //入栈

    Item pop();   //出栈

    int size();

    boolean isEmpty();
}
public class ArrayStack<Item> implements MyStack<Item> {

    private Item[] a = (Item[]) new Object[1];   //
    private int n = 0;   //初始的元素个数

    public ArrayStack(int cap) {
        a = (Item[]) new Object[cap];    //初始化的时候,指定大小,这样就不需要扩容
    }

    @Override
    public MyStack<Item> push(Item item) {
        judgeSize();   //判断容量,是不是需要扩容
        a[n++] = item;   //向数组中添加元素
        return null;
    }

    private void judgeSize() {
        if (n <= a.length) {    //元素的个数已经超出了数组的容量,进行扩容
            resize(2 * a.length);
        } else if (n > 0 && n <= a.length / 2) {
            resize(a.length / 2);   //动态缩容
        }
    }

    private void resize(int size) {
        //扩容:建立一个临时的变量进行扩容,数的赋值关系
        Item[] temp = (Item[]) new Object[size];
        for (int i = 0; i < n; i++) {
            temp[i] = a[i];
        }
        a = temp;
    }


    @Override
    public Item pop() {  //出栈
        if (isEmpty()) {
            return null;
        }
        Item item = a[--n];    //--n 把n减了在用,n--用了在减
        a[n] = null;
        return item;   //默认值为null
    }

    @Override
    public int size() {
        return n;  //默认值为0
    }

    @Override
    public boolean isEmpty() {
        return n == 0;   //默认值为false
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值