数据结构——ArrayStack和LinkedStack的实现

栈是一种后进先出(LIFO)的数据结构。
ArrayStack使用数组来实现,LinkedStack使用链表来实现,各有特点,也都非常简单。
可以说这两个版本就是SimpleArrayList和SimpleLinkedList的简化版。

ArrayStack

import java.util.NoSuchElementException;

public class ArrayStack<T> {
    private static int DEFAULT_CAPACITY = 64; 
    private T[] elements;

    /**
     * 栈顶索引
     */
    private int top = -1;

    public ArrayStack(){
        this(DEFAULT_CAPACITY);
    }

    public ArrayStack(int capacity){
        ensureCapacity(capacity);
    }

    public int size(){
        return top+1;
    }

    public boolean isEmpty(){
        return top == -1;
    }

    /**
     * 入栈
     * @param ele
     */
    public void push(T ele){
        /* 如果栈容量已经满了,则扩展栈大小 */
        if(size() == elements.length)
            ensureCapacity(2 * size() + 1);
        /* 将元素添加到栈顶,并修改栈顶索引 */
        elements[++top] = ele;
    }

    /**
     * 出栈
     * @return
     * @throws NoSuchElementException
     */
    public T pop() throws NoSuchElementException{
        /* 如果为空栈,则抛出异常 */
        if(isEmpty())
            throw new NoSuchElementException("Stack is empty.");
        /* 返回栈顶元素,并修改栈顶位置 */
        return elements[top--];
    }

    /**
     * 重置栈容量大小,可用于扩展栈容量大小
     * @param newCapacity
     */
    @SuppressWarnings("unchecked")
    private void ensureCapacity(int newCapacity){
        if(newCapacity < size())
            return;

        T[] old = elements;
        elements = (T[]) new Object[newCapacity];
        for(int i=0; i < size(); i++){
            elements[i] = old[i];
        }
    }

    @Override
    public String toString() {
        return "top = " + top + " size = " + size();
    }

}

LinkedStack

import java.util.NoSuchElementException;

public class LinkedStack<T> {
    private Node<T> head;
    private int size = 0;

    public LinkedStack(){
        head = new Node<T>(null, null);
    }

    public int size(){
        return size;
    }

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

    /**
     * 入栈操作
     * @param ele
     */
    public void push(T ele){
        Node<T> newNode = new Node<T>(ele, head.next);
        head.next = newNode;
        size++;
    }

    /**
     * 出栈操作,弹出栈顶元素
     * @return 返回栈顶元素值
     * @throws NoSuchElementException
     */
    public T pop() throws NoSuchElementException{
        if(isEmpty())
            throw new NoSuchElementException("Stack is empty.");

        T popElement = head.next.data;
        head.next = head.next.next;
        size--;
        return popElement;
    }

    @Override
    public String toString() {
        return "size = " + size();
    }

    private static class Node<T>{
        public T data;
        public Node<T> next;

        public Node(T data, Node<T> next){
            this.data = data;
            this.next = next;
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Stack)是一种常见的数据结构,它是一种只允许在一端进行插入和删除操作的线性表,这一端被称为顶。的特点是后进先出(Last-In-First-Out,简称 LIFO),即最后压入的元素最先弹出。 在 Java 中,可以使用数组或链表实现。下面分别介绍数组和链表实现的方法。 1. 数组实现 数组实现时,需要定义一个数组和一个指针 top,top 指向顶。中的元素从数组的末尾开始存储,每当有一个元素入时,top 指针加 1;每当有一个元素出时,top 指针减 1。 以下是一个基于数组实现的示例代码: ```java public class ArrayStack { private int[] stack; // 数组 private int top; // 顶指针 public ArrayStack(int size) { stack = new int[size]; top = -1; // 初始化顶指针为 -1 } // 判断是否为空 public boolean isEmpty() { return top == -1; } // 判断是否已满 public boolean isFull() { return top == stack.length - 1; } // 入 public void push(int data) { if (isFull()) { System.out.println("已满,无法入。"); return; } stack[++top] = data; } // 出 public int pop() { if (isEmpty()) { System.out.println("为空,无法出。"); return -1; } return stack[top--]; } // 获取顶元素 public int peek() { if (isEmpty()) { System.out.println("为空,无法获取顶元素。"); return -1; } return stack[top]; } } ``` 2. 链表实现 链表实现时,需要定义一个链表头节点和一个指针 top,top 指向顶。每当有一个元素入时,该元素成为新的头节点,其 next 指针指向原来的头节点;每当有一个元素出时,头节点指针向下移动一个位置。 以下是一个基于链表实现的示例代码: ```java public class LinkedStack { private Node top; // 顶指针 public LinkedStack() { top = null; // 初始化顶指针为 null } // 判断是否为空 public boolean isEmpty() { return top == null; } // 入 public void push(int data) { Node newNode = new Node(data); newNode.next = top; top = newNode; } // 出 public int pop() { if (isEmpty()) { System.out.println("为空,无法出。"); return -1; } int data = top.data; top = top.next; return data; } // 获取顶元素 public int peek() { if (isEmpty()) { System.out.println("为空,无法获取顶元素。"); return -1; } return top.data; } private class Node { private int data; private Node next; public Node(int data) { this.data = data; this.next = null; } } } ``` 以上是两种常见的实现方法,它们在效率和空间占用上略有差别,具体实现应根据具体情况选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值