欢迎访问宙启技术站
智能推送

Java函数实现数据结构:栈、队列、链表全解析

发布时间:2023-06-09 22:30:26

Java作为一门高级编程语言,不仅提供了丰富的语法和模块库,同时也允许开发者自己实现各种数据结构。本文将会全面解析Java实现栈、队列和链表的过程及其重要函数。

1. 栈(Stack)

栈是一种定义为“后进先出”(Last-In-First-Out,LIFO)的数据结构。它基于数组或链表实现,提供了一组简单的操作,例如push(压入)、pop(弹出)和peek(读取栈顶)等。下面是Java语言实现栈的基本代码:

public class Stack {
    private int top;
    private int maxSize;
    private Object[] stackArray;
 
    public Stack(int maxSize) {
        this.maxSize = maxSize;
        stackArray = new Object[maxSize];
        top = -1;
    }
 
    public void push(Object obj) {
        if (isFull())
            throw new RuntimeException("Stack is full!");
        stackArray[++top] = obj;
    }
 
    public Object pop() {
        if (isEmpty())
            throw new RuntimeException("Stack is empty!");
        return stackArray[top--];
    }
 
    public Object peek() {
        if (isEmpty())
            throw new RuntimeException("Stack is empty!");
        return stackArray[top];
    }
 
    public boolean isEmpty() {
        return (top == -1);
    }
 
    public boolean isFull() {
        return (top == maxSize - 1);
    }
}

这段代码定义了一个堆栈(Stack)类,其中包括了五个私有的实例变量,分别是栈顶指针(top)、栈的最大尺寸(maxSize)、存储元素的数组(stackArray)以及两个标志栈是否为空和是否已满的布尔类型的函数。

接下来,我们定义了一个构造方法来初始化栈的大小和顶部指针。此外,还包含一个包装对象(Object)作为参数的push()方法,以将一个单个对象添加到堆栈的顶部。pop()方法则删除并返回顶部对象,peek()方法则返回顶部对象而不删除它。isEmpty()和isFull()方法分别获取栈的状态并返回布尔值。

2. 队列(Queue)

队列是一种定义为“先进先出”(First-In-First-Out,FIFO)的数据结构。它同样可以基于数组或链表实现,提供了一组简单的操作。与栈相比,队列是更高级的模型,因为它提供了有序线性的元素集合,并且支持在任意位置插入和删除元素等更高级操作。下面是Java语言实现队列的基本代码:

public class Queue {
    private int front, rear, size;
    private int capacity;
    private Object[] arr;
 
    public Queue(int capacity) {
        this.capacity = capacity;
        front = this.size = 0;
        rear = capacity - 1;
        arr = new Object[this.capacity];
    }
 
    public boolean isFull(Queue queue) {
        return (queue.size == queue.capacity);
    }
 
    public boolean isEmpty(Queue queue) {
        return (queue.size == 0);
    }
 
    public void enqueue(Object item) {
        if (isFull(this))
            return;
        this.rear = (this.rear + 1) % this.capacity;
        this.arr[this.rear] = item;
        this.size = this.size + 1;
    }
 
    public Object dequeue() {
        if (isEmpty(this))
            return null;
 
        Object item = this.arr[this.front];
        this.front = (this.front + 1) % this.capacity;
        this.size = this.size - 1;
        return item;
    }
 
    public Object front() {
        if (isEmpty(this))
            return null;
 
        return this.arr[this.front];
    }
 
    public Object rear() {
        if (isEmpty(this))
            return null;
 
        return this.arr[this.rear];
    }
}

这段代码定义了一个队列(Queue)类,其中包括了四个私有的实例变量,分别是队列的头尾指针(front和rear)、队列的最大容量(capacity)以及存储元素的数组(arr)。我们定义了一个构造方法来初始化队列的大小和头尾指针。此外,还包含两个布尔型函数,分别判断当前队列是否已满和空。enqueue()方法用于在队列的尾部添加一个元素,dequeue()方法用于删除头部元素并返回其值,front()和rear()方法分别返回头部和尾部元素的值。

3. 链表(LinkedList)

链表是一种线性数据结构,其中每个节点都包含数据和一个指向下一个节点的指针,它们可以是单向链表也可以是双向链表。LinkedList是Java作为一种强类型语言提供的链表数据结构实现。

public class Node {
    int data;
    Node nextNode;

    public Node(int data) {
        this.data = data;
    }

    public void setNextNode(Node nextNode) {
        this.nextNode = nextNode;
    }

    public Node getNextNode() {
        return nextNode;
    }

    public int getData() {
        return data;
    }
}

public class LinkedList {
    Node head;

    public LinkedList() {
        head = null;
    }

    public void add(int data) {
        Node newNode = new Node(data);

        if (head == null) {
            head = newNode;
        } else {
            Node currentNode = head;
            while (currentNode.getNextNode() != null) {
                currentNode = currentNode.getNextNode();
            }
            currentNode.setNextNode(newNode);
        }
    }

    public void delete(int data) {
        if (head == null) {
            return;
        } else if (head.getData() == data) {
            head = head.getNextNode();
            return;
        } else {
            Node currentNode = head;
            while (currentNode.getNextNode() != null) {
                if (currentNode.getNextNode().getData() == data) {
                    currentNode.setNextNode(currentNode.getNextNode().getNextNode());
                    return;
                }
                currentNode = currentNode.getNextNode();
            }
            return;
        }
    }

这段代码中,我们定义了一个链表(LinkedList)类,这个类也是由节点(Node)组成的。Node类用于创建一个节点,包含一个实例变量data,它存储节点的值,以及一个实例变量nextNode,它存储下一个节点的指针。LinkedList类包含一个实例变量head,该变量指向链表的第一个节点。

我们定义了一个构造函数,它将head初始化为null。add()函数将添加一个节点到链表的末尾,并将该节点作为最后一个节点。delete()函数将从链表中移除指定值的节点。如果该节点是头节点,则头指针将指向下一个节点。否则,我们遍历链表,找到需要删除的节点,并将前一个节点的nextNode指向被删除节点的下一个节点,以达到删除节点的目的。

总结

本文介绍了使用Java语言实现栈、队列和链表的方法及其重要函数,这些数据结构都是我们日常编程中常用的基本数据结构。使用Java语言自己实现数据结构不仅有助于更好地理解其工作原理,而且可以通过重写其方法使它们更适合特定的应用场景。