热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java中的静态和动态数据结构,示例

Java中的静态和动态数据结构,示例原文:https://ww

Java 中的静态和动态数据结构,示例

原文:https://www . geeksforgeeks . org/静态和动态数据结构 Java-in-with-examples/

数据结构是一种高效存储和组织数据的方式,这样就可以在时间和内存方面高效地执行所需的操作。简单地说,数据结构用于降低代码的复杂性(主要是时间复杂性)。

数据结构可以是两种类型:

静态数据结构

在静态数据结构中,结构的大小是固定的。数据结构的内容可以修改,但不改变分配给它的内存空间。

静态数据结构示例:



  1. 阵列

    数组是保存固定数量的单一类型值的容器对象。数组的长度是在创建数组时确定的。数组是一组相似类型的变量,由一个通用名称引用。Java 中的数组与 C/C++中的不同。

    语法:

    ```java
    // Declaration
    type var-name[];
    OR
    type[] var-name;

    // Initialization
    var-name = new type [size];

    ```

    实施:

    ```java
    // Java program to illustrate creating an array
    // of integers, puts some values in the array,
    // and prints each value to standard output.

    class GFG {
        public static void main(String[] args)
        {
            // declares an Array of integers.
            int[] arr;

    // allocating memory for 5 integers.
            arr = new int[5];

    // initialize the first
            // element of the array
            arr[0] = 10;

    // initialize the second
            // element of the array
            arr[1] = 20;

    // so on...
            arr[2] = 30;
            arr[3] = 40;
            arr[4] = 50;

    // accessing the elements
            // of the specified array
            for (int i = 0; i             System.out.println(
                    "Element at index "
                    + i + " : " + arr[i]);
        }
    }
    ```

    Output:

    ```java
    Element at index 0 : 10
    Element at index 1 : 20
    Element at index 2 : 30
    Element at index 3 : 40
    Element at index 4 : 50

    ```

    上述数组实现的问题:
    一旦我们创建了数组,我们就不能改变数组的大小。所以数组的大小是不可改变的。



动态数据结构

在动态数据结构中,结构的大小不是固定的,可以在对其执行操作的过程中进行修改。动态数据结构旨在便于在运行时更改数据结构。

动态数据结构示例:



  1. 单链表

    链表是线性数据结构,其中元素不存储在连续的位置,每个元素都是一个独立的对象,有数据部分和地址部分。这些元素使用指针和地址进行链接。每个元素都被称为一个节点。由于插入和删除的动态性和容易性,它们比数组更受欢迎。

    ```java
    // Java code for Linked List implementation

    import java.util.*;

    public class Test {
        public static void main(String args[])
        {
            // Creating object of class linked list
            LinkedList object
                = new LinkedList();

    // Adding elements to the linked list
            object.add("A");
            object.add("B");
            object.addLast("C");
            object.addFirst("D");
            object.add(2, "E");
            object.add("F");
            object.add("G");
            System.out.println("Linked list : "
                               + object);

    // Removing elements from the linked list
            object.remove("B");
            object.remove(3);
            object.removeFirst();
            object.removeLast();
            System.out.println(
                "Linked list after deletion: "
                + object);

    // Finding elements in the linked list
            boolean status = object.contains("E");

    if (status)
                System.out.println(
                    "List contains the element 'E' ");
            else
                System.out.println(
                    "List doesn't contain the element 'E'");

    // Number of elements in the linked list
            int size = object.size();
            System.out.println(
                "Size of linked list = " + size);

    // Get and set elements from linked list
            Object element = object.get(2);
            System.out.println(
                "Element returned by get() : "
                + element);
            object.set(2, "Y");
            System.out.println(
                "Linked list after change : "
                + object);
        }
    }
    ```

    Output:

    ```java
    Linked list : [D, A, E, B, C, F, G]
    Linked list after deletion: [A, E, F]
    List contains the element 'E'
    Size of linked list = 3
    Element returned by get() : F
    Linked list after change : [A, E, Y]

    ```



  2. 双向链表

    双链表包含一个额外的指针,通常称为上一个指针,以及下一个指针数据,它们都在单链表中。

    ```java
    // Java program to demonstrate DLL

    // Class for Doubly Linked List
    public class DLL {
        Node head; // head of list

    / Doubly Linked list Node/
        class Node {
            int data;
            Node prev;
            Node next;

    // Constructor to create a new node
            // next and prev is by default
            // initialized as null
            Node(int d) { data = d; }
        }

    // Adding a node at the front of the list
        public void push(int new_data)
        {
            / 1. allocate node 
            * 2. put in the data
    /
            Node new_Node = new Node(new_data);

    / 3. Make next of new node as head
            and previous as NULL
    /
            new_Node.next = head;
            new_Node.prev = null;

    / 4. change prev of head node to new node /
            if (head != null)
                head.prev = new_Node;

    / 5. move the head to point to the new node /
            head = new_Node;
        }

    / Given a node as prev_node, 
        insert a new node after the given node
    /
        public void InsertAfter(
            Node prev_Node, int new_data)
        {

    /1. check if the given
            prev_node is NULL
    /
            if (prev_Node == null) {
                System.out.println(
                    "The given previous node"
                    + " cannot be NULL ");
                return;
            }

    / 2. allocate node 
            * 3. put in the data
    /
            Node new_node = new Node(new_data);

    / 4. Make next of new node 
            as next of prev_node
    /
            new_node.next = prev_Node.next;

    / 5. Make the next of
            prev_node as new_node
    /
            prev_Node.next = new_node;

    / 6. Make prev_node as
            previous of new_node
    /
            new_node.prev = prev_Node;

    / 7. Change previous of 
            new_node's next node
    /
            if (new_node.next != null)
                new_node.next.prev = new_node;
        }

    // Add a node at the end of the list
        void append(int new_data)
        {
            / 1. allocate node 
            * 2. put in the data
    /
            Node new_node = new Node(new_data);

    Node last = head; / used in step 5/

    / 3. This new node is going
            to be the last node, so 
            * make next of it as NULL
    /
            new_node.next = null;

    / 4. If the Linked List is empty,
            * then make the new 
            * node as head
    /
            if (head == null) {
                new_node.prev = null;
                head = new_node;
                return;
            }

    / 5. Else traverse till
            the last node
    /
            while (last.next != null)
                last = last.next;

    / 6. Change the next of last node /
            last.next = new_node;

    / 7. Make last node as
            previous of new node
    /
            new_node.prev = last;
        }

    // This function prints contents
        // of linked list starting
        // from the given node
        public void printlist(Node node)
        {
            Node last = null;
            System.out.println(
                "Traversal in forward Direction");
            while (node != null) {
                System.out.print(node.data + " ");
                last = node;
                node = node.next;
            }
            System.out.println();
            System.out.println(
                "Traversal in reverse direction");
            while (last != null) {
                System.out.print(last.data + " ");
                last = last.prev;
            }
        }

    / Driver program to test above functions/
        public static void main(String[] args)
        {
            / Start with the empty list /
            DLL dll = new DLL();

    // Insert 6. So linked list becomes 6->NULL
            dll.append(6);

    // Insert 7 at the beginning.
            // So linked list becomes 7->6->NULL
            dll.push(7);

    // Insert 1 at the beginning.
            // So linked list becomes 1->7->6->NULL
            dll.push(1);

    // Insert 4 at the end.
            // So linked list becomes
            // 1->7->6->4->NULL
            dll.append(4);

    // Insert 8, after 7.
            // So linked list becomes
            // 1->7->8->6->4->NULL
            dll.InsertAfter(dll.head.next, 8);

    System.out.println("Created DLL is: ");
            dll.printlist(dll.head);
        }
    }
    ```

    Output:

    ```java
    Created DLL is:
    Traversal in forward Direction
    1 7 8 6 4
    Traversal in reverse direction
    4 6 8 7 1

    ```



  3. 矢量

    向量类实现了一个可增长的对象数组。向量基本上属于遗留类,但现在它与集合完全兼容。Vector 实现了一个动态数组,这意味着它可以根据需要增长或收缩。像数组一样,它包含可以使用整数索引访问的组件。

    ```java
    // Java code illustrating Vector data structure

    import java.util.*;

    class Vector_demo {
        public static void main(String[] arg)
        {

    // Create default vector
            Vector v = new Vector();

    v.add(1);
            v.add(2);
            v.add("geeks");
            v.add("forGeeks");
            v.add(3);

    System.out.println("Vector is " + v);
        }
    }
    ```

    输出:

    ```java
    Vector is [1, 2, geeks, forGeeks, 3]

    ```



  4. 堆叠

    Java Collection 框架提供了一个堆栈类,它建模并实现了一个堆栈数据结构。该课程基于后进先出的基本原则。除了基本的推送和弹出操作,该类还提供了空、搜索和查看三个功能。该类也可以说是对 Vector 的扩展,并将该类视为具有上述五个函数的堆栈。这个类也可以称为 Vector 的子类。

    ```java
    // Java code for stack implementation

    import java.io.;
    import java.util.
    ;

    public class stack_implementation {
        public static void main(String a[])
        {
            Stack stack = new Stack<>();
            stack.push(1);
            stack.push(2);
            stack.push(3);
            stack.push(4);

    int n = stack.size();

    for (int i = 0; i             System.out.println(stack.pop());
            }
        }
    }
    ```

    Output:

    ```java
    4
    3
    2
    1

    ```

    相关文章:


    • 使用数组的堆栈实现

    • 使用单链表的堆栈实现

    • 使用队列的堆栈实现


    • 队列



    队列接口在 java.util 包中可用,它扩展了集合接口。队列集合用于保存将要处理的元素,并提供各种操作,如插入、移除等。它是一个有序的对象列表,其用途仅限于在列表的末尾插入元素,并从列表的开头删除元素,即它遵循先进先出原则。

    ```java
    // Java orogram to demonstrate working
    // of Queue interface in Java

    import java.util.LinkedList;
    import java.util.Queue;

    public class QueueExample {
        public static void main(String[] args)
        {
            Queue q = new LinkedList<>();

    // Adds elements {0, 1, 2, 3, 4} to queue
            for (int i = 0; i <5; i++)
                q.add(i);

    // Display contents of the queue.
            System.out.println("Elements of queue-" + q);

    // To remove the head of queue.
            int removedele = q.remove();
            System.out.println("removed element-"
                               + removedele);

    System.out.println(q);

    // To view the head of queue
            int head = q.peek();
            System.out.println("head of queue-"
                               + head);

    // Rest all methods of collection interface,
            // Like size and contains can be
            // used with this implementation.
            int size = q.size();
            System.out.println("Size of queue-"
                               + size);
        }
    }
    ```

    Output:

    ```java
    Elements of queue-[0, 1, 2, 3, 4]
    removed element-0
    [1, 2, 3, 4]
    head of queue-1
    Size of queue-4

    ```

    相关文章:


    • 使用数组实现队列

    • 使用单链表的队列实现

    • 使用堆栈的队列实现




    树是一种数据结构,将值存储在名为节点的实体中。节点通过称为的线连接。每个节点都在其中存储一个值。
    术语:


    • 是树的最顶端节点。

    • 父节点是一个有一个或多个节点连接的节点。

    • 是连接两个节点的链接。

    • 子节点是有父节点的节点

    • 是一个没有任何子节点附着的节点,它是一棵树的最底层节点。

    ```java
    // Java program for different tree traversals

    / Class containing left and right child of current 
    node and key value
    /
    class Node {
        int key;
        Node left, right;

    public Node(int item)
        {
            key = item;
            left = right = null;
        }
    }

    class BinaryTree {
        // Root of Binary Tree
        Node root;

    BinaryTree()
        {
            root = null;
        }

    / Given a binary tree, print
        its nodes according to the 
        "bottom-up" postorder traversal.
    /
        void printPostorder(Node node)
        {
            if (node == null)
                return;

    // first recur on left subtree
            printPostorder(node.left);

    // then recur on right subtree
            printPostorder(node.right);

    // now deal with the node
            System.out.print(node.key + " ");
        }

    / Given a binary tree, 
        print its nodes in inorder
    /
        void printInorder(Node node)
        {
            if (node == null)
                return;

    / first recur on left child /
            printInorder(node.left);

    / then print the data of node /
            System.out.print(node.key + " ");

    / now recur on right child /
            printInorder(node.right);
        }

    / Given a binary tree,
        print its nodes in preorder
    /
        void printPreorder(Node node)
        {
            if (node == null)
                return;

    / first print data of node /
            System.out.print(node.key + " ");

    / then recur on left sutree /
            printPreorder(node.left);

    / now recur on right subtree /
            printPreorder(node.right);
        }

    // Wrappers over above recursive functions
        void printPostorder() { printPostorder(root); }
        void printInorder() { printInorder(root); }
        void printPreorder() { printPreorder(root); }

    // Driver method
        public static void main(String[] args)
        {
            BinaryTree tree = new BinaryTree();
            tree.root = new Node(1);
            tree.root.left = new Node(2);
            tree.root.right = new Node(3);
            tree.root.left.left = new Node(4);
            tree.root.left.right = new Node(5);

    System.out.println(
                "Preorder traversal of binary tree is ");
            tree.printPreorder();

    System.out.println(
                "\nInorder traversal of binary tree is ");
            tree.printInorder();

    System.out.println(
                "\nPostorder traversal of binary tree is ");
            tree.printPostorder();
        }
    }
    ```

    Output:

    ```java
    Preorder traversal of binary tree is
    1 2 4 5 3
    Inorder traversal of binary tree is
    4 2 5 1 3
    Postorder traversal of binary tree is
    4 5 2 3 1

    ```



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
author-avatar
膈应人的ID
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有