Java数据结构之链表、栈、队列、树的实现方法示例

Java数据结构之链表、栈、队列、树的实现方法示例

链表

链表是一种线性数据结构,由节点的集合构成。每个节点包含两部分,数据部分和指针部分。数据部分用于存储数据,指针部分用于指向下一个节点。

单向链表示例

public class LinkedList<E>{
  private Node<E> head;
  private int size;

  private static class Node<E>{
    E item;
    Node<E> next;
    public Node(E item,Node<E> next){
      this.item = item;
      this.next = next;
    }
  }

  public void add(E item){
    head = new Node<>(item,head);
    size++;
  }

  public E remove(){
    if(head == null) throw new NoSuchElementException();
    E item = head.item;
    head = head.next;
    size--;
    return item;
  }
}

双向链表示例

public class DoublyLinkedList<E>{
  private Node<E> head;
  private Node<E> tail;
  private int size;

  private static class Node<E>{
    E item;
    Node<E> next;
    Node<E> prev;
    public Node(E item,Node<E> next,Node<E> prev){
      this.item = item;
      this.next = next;
      this.prev = prev;
    }
  }

  public void addFirst(E item){
    Node<E> newNode = new Node<>(item,head,null);
    if(head == null){
      head = tail = newNode;
    } else {
      head.prev = newNode;
      head = newNode;
    }
    size++;
  }

  public void addLast(E item){
    Node<E> newNode = new Node<>(item,null,tail);
    if(tail == null){
      head = tail = newNode;
    } else {
      tail.next = newNode;
      tail = newNode;
    }
    size++;
  }

  public E removeFirst(){
    if(head == null) throw new NoSuchElementException();
    E item = head.item;
    head = head.next;
    head.prev = null;
    size--;
    return item;
  }

  public E removeLast(){
    if(tail == null) throw new NoSuchElementException();
    E item = tail.item;
    tail = tail.prev;
    tail.next = null;
    size--;
    return item;
  }
}

栈是一种线性数据结构,只能在一端插入、删除元素,这一端被称为栈顶。后进先出(LIFO)是它的典型特点。

数组实现示例

public class ArrayStack<E>{
  private E[] stack;
  private int top;
  private int capacity;

  @SuppressWarnings("unchecked")
  public ArrayStack(int capacity){
    this.capacity = capacity;
    stack = (E[]) new Object[capacity];
    top = -1;
  }

  public void push(E item){
    if(top == capacity - 1) throw new StackOverflowError();
    stack[++top] = item;
  }

  public E pop(){
    if(top == -1) throw new EmptyStackException();
    return stack[top--];
  }

  public E peek(){
    if(top == -1) throw new EmptyStackException();
    return stack[top];
  }

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

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

链表实现示例

public class LinkedListStack<E>{
  private Node<E> top;
  private int size;

  private static class Node<E>{
    E item;
    Node<E> next;
    public Node(E item,Node<E> next){
      this.item = item;
      this.next = next;
    }
  }

  public void push(E item){
    top = new Node<>(item,top);
    size++;
  }

  public E pop(){
    if(top == null) throw new EmptyStackException();
    E item = top.item;
    top = top.next;
    size--;
    return item;
  }

  public E peek(){
    if(top == null) throw new EmptyStackException();
    return top.item;
  }

  public boolean isEmpty(){
    return top == null;
  }

  public int size(){
    return size;
  }
}

队列

队列是一种线性数据结构,支持在队尾插入元素,在队首删除元素,先进先出(FIFO)是它的典型特点。

数组实现示例

public class ArrayQueue<E>{
  private E[] queue;
  private int front;
  private int rear;
  private int capacity;

  @SuppressWarnings("unchecked")
  public ArrayQueue(int capacity){
    this.capacity = capacity;
    queue = (E[]) new Object[capacity];
    front = rear = -1;
  }

  public void enqueue(E item){
    if(rear == capacity - 1) throw new RuntimeException("Queue full");
    queue[++rear] = item;
    if(front == -1) front = 0;
  }

  public E dequeue(){
    if(front == -1 || front > rear) throw new RuntimeException("Queue empty");
    E item = queue[front++];
    if(front > rear) front = rear = -1;
    return item;
  }

  public E peek(){
    if(front == -1 || front > rear) throw new RuntimeException("Queue empty");
    return queue[front];
  }

  public boolean isEmpty(){
    return front == -1 || front > rear;
  }

  public boolean isFull(){
    return rear == capacity - 1;
  }

  public int size(){
    if(front == -1) return 0;
    return rear - front + 1;
  }
}

链表实现示例

public class LinkedListQueue<E>{
  private Node<E> head;
  private Node<E> tail;

  private static class Node<E>{
    E item;
    Node<E> next;
    public Node(E item,Node<E> next){
      this.item = item;
      this.next = next;
    }
  }

  public void enqueue(E item){
    Node<E> newNode = new Node<>(item,null);
    if(head == null){
      head = tail = newNode;
    } else {
      tail.next = newNode;
      tail = newNode;
    }
  }

  public E dequeue(){
    if(head == null) throw new NoSuchElementException();
    E item = head.item;
    head = head.next;
    if(head == null) tail = null;
    return item;
  }

  public E peek(){
    if(head == null) throw new NoSuchElementException();
    return head.item;
  }

  public boolean isEmpty(){
    return head == null;
  }
}

树是一种非线性数据结构,由节点和边组成。每个节点只有一个父节点,但是可以有多个子节点。根节点是没有父节点的特殊节点。

二叉搜索树示例

public class BinarySearchTree<E extends Comparable<? super E>>{
  private TreeNode<E> root;

  private static class TreeNode<E>{
    E item;
    TreeNode<E> left;
    TreeNode<E> right;
    public TreeNode(E item){
      this.item = item;
    }
  }

  public void insert(E item){
    root = insert(root,item);
  }

  private TreeNode<E> insert(TreeNode<E> node,E item){
    if(node == null) return new TreeNode<>(item);
    int compareResult = item.compareTo(node.item);
    if(compareResult < 0){
      node.left = insert(node.left,item);
    } else if(compareResult > 0){
      node.right = insert(node.right,item);
    }
    return node;
  }

  public void remove(E item){
    root = remove(root,item);
  }

  private TreeNode<E> remove(TreeNode<E> node,E item){
    if(node == null) return null;
    int compareResult = item.compareTo(node.item);
    if(compareResult < 0){
      node.left = remove(node.left,item);
    } else if(compareResult > 0){
      node.right = remove(node.right,item);
    } else {
      if(node.left != null && node.right != null){
        node.item = findMin(node.right).item;
        node.right = remove(node.right,node.item);
      } else {
        node = node.left != null ? node.left : node.right;
      }
    }
    return node;
  }

  private TreeNode<E> findMin(TreeNode<E> node){
    if(node == null) return null;
    while(node.left != null){
      node = node.left;
    }
    return node;
  }

  private TreeNode<E> findMax(TreeNode<E> node){
    if(node == null) return null;
    while(node.right != null){
      node = node.right;
    }
    return node;
  }

  public boolean contains(E item){
    return contains(root,item);
  }

  private boolean contains(TreeNode<E> node,E item){
    if(node == null) return false;
    int compareResult = item.compareTo(node.item);
    if(compareResult < 0){
      return contains(node.left,item);
    } else if(compareResult > 0){
      return contains(node.right,item);
    } else {
      return true;
    }
  }
}

以上就是Java数据结构之链表、栈、队列、树的实现方法示例的详细攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之链表、栈、队列、树的实现方法示例 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C++数据结构之哈希表的实现

    以下是详细的讲解: C++数据结构之哈希表的实现 哈希表的概念 哈希表是一种能够实现快速查找的散列表,通过将关键字映射到哈希表中的一个位置来实现快速查找。哈希表的查询、删除时间复杂度为O(1),操作效率非常高,所以常常被用来对大量数据进行检索。 哈希表的实现 哈希函数 哈希函数的主要作用就是将任意长度的输入数据转化为固定长度的散列值,一般采用对关键字进行取模…

    数据结构 2023年5月17日
    00
  • 一文了解mysql索引的数据结构为什么要用B+树

    MySQL索引的数据结构主要为B+树,那么B+树为什么是最适合作为索引数据结构呢?在介绍B+树之前,我们先来了解下B树。 B树B树是一棵多路平衡查找树,也称为B-树(B-tree),主要应用在文件系统和数据库中,可以显著减少I/O操作次数。B树的每个节点存储的元素个数比二叉查找树的节点多,且节点存储的元素是按顺序排列的,这些特点使得在查找过程中可以快速定位需…

    数据结构 2023年5月17日
    00
  • C语言深入浅出讲解顺序表的实现

    C语言深入浅出讲解顺序表的实现 顺序表简介 顺序表是一种线性表的存储结构,它是由连续的内存空间来存储线性表中的元素。 顺序表的特点是支持查找、插入和删除操作,操作效率较高,但需要提前分配足够大的内存空间。当顺序表空间不足时,需要扩容,移动数据较为麻烦。 顺序表的实现 数据结构定义 顺序表的数据结构定义包含以下几个成员: 数据元素数组 data,存储线性表中的…

    数据结构 2023年5月17日
    00
  • 基于C++详解数据结构(附带例题)

    基于C++详解数据结构(附带例题)攻略 简介 该攻略是基于C++编程语言详解数据结构的,主要涉及数据结构中的相关概念、操作以及例题演练。C++语言作为一种高性能的编程语言,对于开发数据结构问题具有很大的优势。 数据结构概念 数据结构基本概念 数据结构是计算机存储、组织数据的方式。具体来说,数据结构可以理解为计算机存储数据的一种方式,也可以看作是一些组织数据的…

    数据结构 2023年5月17日
    00
  • JavaScript 处理树数据结构的方法示例

    下面是“JavaScript 处理树数据结构的方法示例”的完整攻略。 什么是树数据结构 树形数据结构是一种非常重要的数据结构,常被用于模拟现实中大量的层级结构。例如:文件目录、网站导航等。其是由一个根节点和若干个子节点构成的,每个节点可以有0个或多个子节点。 使用 JavaScript 处理树形数据结构 了解了树形数据结构后,我们可以使用 JavaScrip…

    数据结构 2023年5月17日
    00
  • 从零学JSON之JSON数据结构

    从零学JSON之JSON数据结构 什么是JSON? JSON全称为JavaScript Object Notation,即JavaScript对象表示法。它是一种轻量级的数据交换格式,具有可读性高、易于开发和解析的特点。JSON格式通常用于客户端和服务器之间的数据传输,可以支持多种编程语言。如下是一个简单的JSON格式示例: { "name&quo…

    数据结构 2023年5月17日
    00
  • C++数据结构关于栈迷宫求解示例

    C++数据结构关于栈迷宫求解示例攻略 在本篇攻略中,我们将使用C++数据结构中的栈来解决迷宫问题,具体将通过两个示例来详细讲解该方法。首先介绍一下栈的概念。 栈的概念 栈是一种“后入先出”的数据结构,即最后压入栈中的元素会首先被弹出,而最早压入栈中的元素会最后被弹出。栈的基本操作有入栈(push)、出栈(pop)、判断是否为空以及读取栈顶元素等。 迷宫问题 …

    数据结构 2023年5月17日
    00
  • C++数据结构之双向链表

    C++数据结构之双向链表完整攻略 1. 什么是双向链表 双向链表是一种特殊的链表结构,每个节点拥有两个指针域,分别指向前继和后继节点。 双向链表不需要像单向链表那样从头到尾遍历整个链表,可以通过前后指针直接访问前后节点,提高了查找、删除、插入等操作的效率。 双向链表有一些常用的操作,如插入节点、删除节点、查找节点等。 2. 双向链表的实现 2.1 节点定义 …

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部