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++ 数据结构超详细讲解单链表 什么是单链表 单链表是一种常见的线性数据结构,它由若干个节点组成,每个节点包含两部分内容:数据域和指针域。其中数据域存储节点所携带的数据,而指针域存储下一个节点的地址。 单链表的性质在于每个节点只有一个指针域,而第一个节点叫做头节点,通常不存放数据,只用来标注链表的起始位置。最后一个节点的指针域指向 NULL,即表示链表的结…

    数据结构 2023年5月17日
    00
  • Java数据结构的十大排序

    Java数据结构的十大排序攻略 简介 在计算机科学中,排序算法是一种将一串数据按照特定顺序进行排列的方法,其中常见的排序算法有很多种,不同的算法适用于不同的数据类型和数据规模。Java是一种常见的编程语言,也提供了很多实现排序算法的类和方法。 本文将介绍Java数据结构的十大排序算法,分别为:插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序、堆排序…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构常见面试问题整理

    JavaScript数据结构常见面试问题整理 介绍 JavaScript是一种广泛使用的脚本语言,用于在Web上创建动态效果,验证表单,增强用户体验等。它是一种高级语言,使用许多数据结构来存储和处理数据。在面试中,考官通常会问一些与JavaScript数据结构相关的问题,这篇文章将整理一些常见的面试问题和他们的解答,以便帮助你做好准备。 常见问题 1. 什么…

    数据结构 2023年5月17日
    00
  • 2021年最新Redis面试题汇总(1)

    下面我将为您详细讲解“2021年最新Redis面试题汇总(1)”的完整攻略。 1. Redis概述 首先,我们需要了解Redis是什么,以及它的特点和应用场景。 1.1 什么是Redis Redis是一种内存中的数据结构存储,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,并提供了丰富的功能,如事务、持久化、Lua…

    数据结构 2023年5月17日
    00
  • Redis之常用数据结构哈希表

    Redis之常用数据结构哈希表 Redis是一种开源的、高性能的、基于内存的数据存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。其中哈希表是一种常用的数据结构,本文将详细讲解Redis中的哈希表。 哈希表概述 哈希表是一种通过哈希函数和数组实现的数据结构,能够快速地进行插入、查找和删除等操作,时间复杂度为O(1)。在Redis中,哈…

    数据结构 2023年5月17日
    00
  • F – 产生冠军(不使用拓扑排序)

    题目描述 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之…

    算法与数据结构 2023年4月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
  • C语言数据结构之队列算法详解

    C语言数据结构之队列算法详解 什么是队列? 在计算机科学中,队列是一种抽象数据类型或线性数据结构。它具有先进先出(FIFO)的特性,即先进入队列的元素先被处理或先被移除。队列通常用于解决先到先服务的问题(如请求处理),但也常用于广泛的异步编程中。 队列的特点 队列通常具有以下特点: 队列可以为空; 队列从队首插入元素,从队尾移除元素; 队列只允许从队尾插入元…

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