Java数据结构:栈的实现

目录

一、链表实现栈

链表实现栈的代码如下:

二、数组实现栈

数组实现栈的代码如下:

三、总结


栈(Stack)是一种线性数据结构,特殊之处在于它只能在一端进行操作。栈具有先进后出的特性,常用来解决需要后进先出的问题,例如浏览器的返回功能,编辑器的撤销操作等。在Java中,栈的实现有多种方式,本文将讨论链表和数组两种实现方式。

一、链表实现栈

链表实现栈的代码如下:

public class LinkListStack implements Stack, Iterable {
     private final int capacity;//栈的容量
     private int size;//栈内元素的大小
     private final Node head = new Node(null, null);//头节点
     public LinkListStack(int capacity) {
        this.capacity = capacity;
    }
     /*
           head -> 2 -> 1 -> null
        */
    @Override
    public boolean push(E value) {
        if(isFull()){
            return false;
        }
        head.next=new Node<>(value,head.next);
        size++;
        return true;
    }
     @Override
    public E pop() {
        if(isEmpty()){
            return null;
        }
        Node first=head.next;//记录删除元素的值
        head.next=first.next;//跳过删除元素只想删除元素的下一个元素
        size--;//长度--
        return first.value;
    }
     @Override
    public E peek() {
        if(isEmpty()){
            return null;
        }
        return head.next.value;
    }
     @Override
    public boolean isEmpty() {
        return head.next==null;
    }
     @Override
    public boolean isFull() {
        return capacity==size;
    }
     @Override
    public Iterator iterator() {
        return new Iterator() {
            Nodep=head.next;
            @Override
            public boolean hasNext() {
                return p!=null;
            }
             @Override
            public E next() {
                E value = p.value;
                p=p.next;
                return value;
            }
        };
    }
     //构造节点类
    static class Node {
        E value;
        Node next;
         public Node(E value, Node next) {
            this.value = value;
            this.next = next;
        }
    }
}

链表实现栈的核心思想是每个节点存储数据和下一个节点的引用,使用头节点来表示栈顶元素。下面是链表实现栈的特点:

1.新增元素时,将元素插入到头节点后面。

2.删除元素时,将头节点指向下一个元素即可。

3.判断栈是否为空只需判断头节点的下一个元素是否为空。

4.判断栈是否已满只需判断栈的大小是否等于容量。

5.链表实现栈可以使用迭代器来遍历栈中的元素。

二、数组实现栈

数组实现栈的代码如下:

public class ArrayStack implements Stack, Iterable{
     private final E[]array;
    private int top=0;
     public ArrayStack(int capacity) {
        this.array = (E[])new Object[capacity];
    }
     @Override
    public boolean push(E value) {
        if (!isFull()) {
            array[top++] = value;
        }
        return false;
    }
     @Override
    public E pop() {
        if (isEmpty()) {
            return null;
        }
        return array[--top];
    }
     @Override
    public E peek() {
        if(!isEmpty()){
            return array[top-1];
        }
        return null;
    }
     @Override
    public boolean isEmpty() {
        return top==0;
    }
     @Override
    public boolean isFull() {
        return top== array.length;
    }
     @Override
    public Iterator iterator() {
        return null;
    }
}

数组实现栈的核心思想是使用数组存储栈中的元素,使用一个指针来指向栈顶元素。下面是数组实现栈的特点:

1.新增元素时,将元素插入到top位置,然后将top指针+1。

2.删除元素时,将top指针-1,并返回top位置的元素。

3.判断栈是否为空只需判断top指针是否为0。

4.判断栈是否已满只需判断top指针是否等于数组长度。

5.数组实现栈暂时无法使用迭代器来遍历栈中的元素。

三、总结

链表实现栈和数组实现栈都有各自的特点和适用场景。链表实现栈在增删操作方面具有优势,适合容量不固定的场景。数组实现栈在查询操作方面具有优势,适合容量固定的场景。在实际使用过程中,需要根据具体情况来选择合适的实现方式。

你可能感兴趣的:(数据结构,java,数据结构,开发语言)