美文网首页程序员
Java实现一个栈就这么简单

Java实现一个栈就这么简单

作者: 耶也夜 | 来源:发表于2018-07-09 17:49 被阅读31次

栈定义

栈是一种基于后进先出(LIFO)策略的集合类型。本章讨论如何使用Java语言实现一个基本的栈。一个栈容器要求提供入栈操作,出栈操作,获取栈大小和判断栈是否为空操作。抽象数据类型可定义为:

public interface Stack<Item> {
    /*
    *  判断栈是否为空。
    */
    public boolean isEmpty();
    /*
    *  获取栈大小。
    */
    public int size();
    /*
    *  入栈。
    */
    public void push(Item item);
    /*
    *  出栈。
    */
    public Item pop();
}

数组实现

栈元素存储在数组中是一种基本的实现方式。内部定义一个数组[]a用于存在入栈的元素,整数N保存当前元素数量。

public class ArrayStack<Item> implements Stack<Item> {

    /**
    * 存储栈元素
    */
    private Item[] a = (Item[]) new Object[1];
    /**
    * 栈元素数量
    */
    private int N;

    @Override
    public boolean isEmpty() {
        return N == 0;
    }

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

    @Override
    public void push(Item item) {
        a[N++] = item;
    }

    @Override
    public Item pop() {
        Item item = a[--N];
        a[N] = null;
        return item;
    }
}

选择用数组标示栈内容必须先预估栈最大容量大小。在Java中,数组一旦创建,其大小就不能改变。在实际应用中,我们一般无法在创建栈时确定其大小。如果太小,会导致数组越界,如果太大,则会浪费内存空间。因此,我们需要在入栈和出栈中动态的调整数据大小。

入栈时通过检查栈大小N和数组大小a.length是否相等来检查是否能够容纳新的元素。如果没有多余的空间,将数组的的长度加倍。
出栈时检查栈大小是否小于数组的四分之一,如果满足则把数组大小减半。

public class ResizingArrayStack<Item> implements Stack<Item> {

    private Item[] a = (Item[]) new Object[1];
    private int N = 0;

    public boolean isEmpty() {
        return N == 0;
    }

    public int size() {
        return N;
    }

    public void push(Item item) {
        if (N == a.length) {
            resize(2 * a.length);
        }
        a[N++] = item;
    }

    private void resize(int max) {
        Item[] temp = (Item[]) new Object[max];
        System.arraycopy(a, 0, temp, 0, N);
        a = temp;
    }

    public Item pop() {
        Item item = a[--N];
        a[N] = null;  // 避免对象游离
        if (N > 0 && N == a.length / 4) {
            resize(a.length / 2);
        }
        return item;
    }

    public static void main(String[] args) {
        ResizingArrayStack<String> stack = new ResizingArrayStack<>();
        stack.push("ye");
        stack.push("c");
        stack.push("l");

        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
    }
}

数组实现的缺点在于某些push()和pop()操作会调整数组的大小:这项操作的耗时和栈大小成正比。为了克服这个缺点,可以采用链表实现栈。

链表实现

链表是一种递归的数据结构,它或者为空,或者指向一个节点的引用,该节点含有一个泛型的元素和一个指向另一个链表的结构。

节点的抽象数据类型可以表示为:

private class Node{
    /**
     * 存储数据
     */
    Item item;
    /**
     * 下一个节点引用
     */
    Node next;
}

链表实现时用一个节点表示栈顶元素,整数N记录栈大小。入栈时新节点的下一个节点引用指向原来的栈顶节点,出栈时栈顶元素指向原来栈顶元素的下一个节点。

public class LinkedStack<Item> implements Stack<Item> {
    /**
    * 栈顶
    */
    private Node first;
    /**
    * 元素数量
    */
    private int N;

    private class Node {
        Item item;
        Node next;
    }

    @Override
    public boolean isEmpty() {
        return first == null; // or N == 0;
    }

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

    @Override
    public void push(Item item) {
        // 栈顶添加元素
        Node oldFirst = first;
        first = new Node();
        first.item = item;
        first.next = oldFirst;
        N++;
    }

    @Override
    public Item pop() {
        // 栈顶删除元素
        Item item = first.item;
        first = first.next;
        N--;
        return item;
    }
}

在结构化存储数据集时,链表是数组的一种重要替代方式。它们各有优点和缺点,我们应该根据实际情况选择合适的实现。

相关文章

  • Java实现一个栈就这么简单

    栈定义 栈是一种基于后进先出(LIFO)策略的集合类型。本章讨论如何使用Java语言实现一个基本的栈。一个栈容器要...

  • Java示例教程

    Java 实现栈stackJava 实现栈stack2Java 向量Vector 反转Java 向量Vector ...

  • Java数据结构和算法系列———栈

    目录 1、栈的基本概念2、Java模拟简单的顺序栈实现3、增强功能版栈4、利用栈实现字符串逆序5、利用栈判断分隔符...

  • 栈的简单Java实现

    栈栈的特点是先进后出,出栈、入栈都是在栈顶操作。

  • 基于动态数组的实现 Java实现 基于链表的栈的实现 Java实现

  • Java 使用栈实现简单队列功能

    Java 使用栈实现简单队列功能 前两天面试奇安信,有问到如果通过栈实现队列,当时没有回答清楚,现在记录一下。 ...

  • 数据结构--栈

    栈栈---后进先出 在Java里有一个Vector的子类Stack()实现了栈。 Stack()方法 boolea...

  • iOS 实现一个栈 使用数组(一)

    iOS 实现一个栈 苹果的Cocoa并没有暴露系统的栈结构 ,这里根据栈的特点,使用数组实现了一个简单的栈。 My...

  • LeetCode 每日一题 [12] 用队列实现栈

    LeetCode 用队列实现栈 [简单] 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈pop(...

  • JavaScript简单实现栈

    JavaScript简单实现栈主要是通过数组实现,以下是简单实现的代码

网友评论

    本文标题:Java实现一个栈就这么简单

    本文链接:https://www.haomeiwen.com/subject/fnstpftx.html