栈的两种实现方式

1.数组实现

/**
 * @author yhd
 * @email 
 * @description 栈 ,使用数组实现 , 基本操作包括 入栈 出栈 栈中元素个数
 * @since 2021/4/7 0:21
 */
public class Zhan<T> {
    //栈容器
    private T[] arr;

    //构造器指定栈容量
    public Zhan(int size) {
        arr = (T[]) new Object[size];
    }

    //记录栈中元素个数
    private int length = 0;

    //入栈
    public void push(T data) {
        if (length + 1 <= arr.length) {
            arr[length++] = data;
        }else{
            throw new RuntimeException("栈满,无法添加元素");
        }
    }

    //出栈
    public T pop() {
        if (length == 0) {
            throw new RuntimeException("栈空,无元素可以弹出!");
        }
        T data = arr[--length];
        arr[length] = null;
        return data;
    }

    public int getSize() {
        return length;
    }
}

2.链表实现

/**
 * @author yhd
 * @email yinhuidong1@xiaomi.com
 * @description 使用链表实现栈  入栈 出栈 栈中元素个数
 * @since 2021/4/7 1:03
 * <p>
 * 1
 * 2 1
 * 3 2 1
 * 4 3 2 1
 * 5 4 3 2 1
 * 5 4 3 2
 * 5 4 3
 * 5 4
 * 5
 */
public class Zhan2 {

    LinkList linkList;

    public Zhan2(){
     linkList=new LinkList();
    }

    //入栈
    public void push(int data){
        linkList.push(data);
    }

    //出栈
    public int pop(){
        return linkList.pop();
    }

    //元素个数
    public int size(){
        return linkList.getLength();
    }
    class Node {
        int data;
        Node next;

        public Node(int data) {
            this.data = data;
        }
    }

    class LinkList {
        Node head = new Node(0);

        int length = 0;

        //入栈 头插
        public void push(int data) {
            if (head.next == null) {
                head.next = new Node(data);
            } else {
                Node node = new Node(data);
                node.next = head.next;
                head.next = node;
            }
            length++;
        }

        //出栈 头删
        public int pop() {
            if (head.next == null) {
                throw new RuntimeException("栈中无元素,无法弹出!");
            }
            int data = head.next.data;
            head.next=head.next.next;
            length--;
            return data;
        }

        //元素个数
        public int getLength() {
            return length;
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值