为了账号安全,请及时绑定邮箱和手机立即绑定

数据结构——栈

标签:
Java 算法

栈具有先进后出的特性。栈和队列一样,同样是一种特殊的列表。本文将介绍栈的基本接口及数组栈链栈的Java实现。

接口

包含了基本的栈操作方法。
源码

public interface IStack<T> {
    void push(T data); // 入栈
    T peek(); // 取栈顶元素
    T pop(); // 出栈
    int size(); // 长度
    boolean isEmpty(); // 是否为空
}
数组栈

使用数组实现,需要注意的是,这里复用了count变量,使它具有计数和栈顶指针的两个功能。
源码
测试类

public class MyArrayStack<T> implements IStack<T> {

    private T[] datas;
    int count = 0; // 栈长度,兼栈顶指针
    int capacity; // 数组容量

    public MyArrayStack(int capacity) {
        this.capacity = capacity;
        this.datas = (T[]) new Object[capacity];
    }

    @Override
    public void push(T data) {
        if (count == capacity)
            throw new RuntimeException("栈已满");
        this.datas[count++] = data;
    }

    @Override
    public T peek() {
        if (isEmpty())
            throw new RuntimeException("栈为空");
        return datas[count - 1];
    }

    @Override
    public T pop() {
        if (isEmpty())
            throw new RuntimeException("栈为空");
        return datas[--count];
    }

    @Override
    public int size() {
        return count;
    }

    @Override
    public boolean isEmpty() {
        return count == 0;
    }
}
链栈

很简单清晰的实现,没有过多好说的。
源码
测试类

public class MyLinkedStack<T> implements IStack<T> {

    private class Node {
        T data;
        Node next;
        Node() {}
        Node(T data) {
            this.data = data;
        }
        Node(T data, Node next) {
            this.data = data;
            this.next = next;
        }
    }

    private Node top = new Node(); // 栈顶为top.next
    private int count = 0;

    @Override
    public void push(T data) {
        Node node = new Node(data, top.next);
        top.next = node;
        count++;
    }

    @Override
    public T peek() {
        if (isEmpty())
            throw new RuntimeException("栈为空");
        return top.next.data;
    }

    @Override
    public T pop() {
        if (isEmpty())
            throw new RuntimeException("栈为空");
        T res = top.next.data;
        top = top.next;
        count--;
        return res;
    }

    @Override
    public int size() {
        return count;
    }

    @Override
    public boolean isEmpty() {
        return count == 0;
    }
}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消