Java数据结构学习之栈和队列

Java数据结构学习之栈和队列

什么是栈

栈(stack)是一种线性数据结构,它只能在一端进行插入和删除操作,这一端被称作栈顶(top)。栈的特点是先进后出(FILO,First-In-Last-Out),即最后进入的元素最先被删除。

栈的实现方式

栈可以使用数组或链表来实现。使用数组实现的栈称作顺序栈,使用链表实现的栈称作链式栈。以下是顺序栈的 Java 代码示例:

public class ArrayStack {
    private int[] stack; // 存储栈中元素的数组
    private int top; // 栈顶指针

    public ArrayStack(int capacity) {
        stack = new int[capacity];
        top = -1;
    }

    public void push(int element) {
        if (top == stack.length - 1) {
            throw new RuntimeException("Stack is full");
        }
        top++;
        stack[top] = element;
    }

    public int pop() {
        if (top == -1) {
            throw new RuntimeException("Stack is empty");
        }
        int element = stack[top];
        top--;
        return element;
    }

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

栈的应用举例

一种经典的栈的应用场景是括号匹配。例如,判断一个字符串中的括号是否匹配。可以使用栈来存储左括号,当遇到右括号时,弹出栈顶元素,如果与当前右括号不能匹配,则说明括号不匹配。

另一个栈的应用场景是后缀表达式求值。例如,计算后缀表达式 3 5 + 2 * 的值。这个表达式表示 (3 + 5) * 2,按照运算符的优先级计算,可以使用栈来存储数字,遇到操作符时弹出栈顶元素进行计算,再将结果压入栈中。

什么是队列

队列(queue)也是一种线性数据结构,它与栈类似,但是队列的插入和删除分别在两端进行,插入操作在队尾(rear)进行,删除操作在队头(front)进行。队列的特点是先进先出(FIFO,First-In-First-Out),即先进入的元素先被删除。

队列的实现方式

队列同样可以使用数组或链表来实现。使用数组实现的队列称作顺序队列,使用链表实现的队列称作链式队列。以下是链式队列的 Java 代码示例:

public class LinkedQueue {
    private class Node {
        int element;
        Node next;

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

    private Node front; // 队列头指针
    private Node rear; // 队列尾指针

    public LinkedQueue() {
        front = null;
        rear = null;
    }

    public void enqueue(int element) {
        Node newNode = new Node(element);
        if (rear == null) {
            front = newNode;
            rear = newNode;
        } else {
            rear.next = newNode;
            rear = newNode;
        }
    }

    public int dequeue() {
        if (front == null) {
            throw new RuntimeException("Queue is empty");
        }
        int element = front.element;
        front = front.next;
        if (front == null) {
            rear = null;
        }
        return element;
    }

    public int size() {
        int size = 0;
        Node curr = front;
        while (curr != null) {
            size++;
            curr = curr.next;
        }
        return size;
    }
}

队列的应用举例

队列的一个应用场景是生产者-消费者问题。例如,在一个多线程环境下,有一个队列用来存储任务,多个生产者线程往队列中插入任务,多个消费者线程从队列中取出任务进行处理。使用队列可以保证任务的顺序,避免竞争条件。

另一个队列的应用场景是广度优先搜索算法。例如,在一个迷宫问题中,需要寻找出口。可以把每个迷宫的单元格看做一个图中的节点,用队列来存储待处理的节点,按照距离逐层处理。这样可以保证找到的出口一定是离起点最近的出口。

总结

本文介绍了栈和队列两种线性数据结构,以及它们的实现方式和应用场景。栈和队列是编程中常用的基本数据结构,熟练掌握它们的使用可以提高编程效率和代码质量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构学习之栈和队列 - Python技术站

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

相关文章

  • nginx内存池源码解析

    Nginx内存池源码解析 Nginx是一个高性能、高并发的Web服务器。为了提高其性能和速度,Nginx采用了特殊的内存管理机制,即内存池。 什么是内存池? 内存池是一种高效的内存分配和管理机制。它将一块内存划分成多个大小相等的块,并按需分配给系统。当内存块不再使用时,它并不被立即释放,而是留在内存池中待重复利用。 Nginx内存池结构 Nginx内存池主要…

    数据结构 2023年5月17日
    00
  • js实现无限层级树形数据结构(创新算法)

    要实现无限层级树形数据结构,可以使用递归算法来解决。以下是该过程的详细攻略: 步骤1:准备数据 为了演示无限层级树形结构,我们需要准备一组具有父子关系的数据。数据可以是任何格式,例如在子对象节点下添加一个名为children的数组即可。 例如,假设我们有以下数据: const data = [ { id: 1, name: "Node 1&quot…

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

    C++数据结构之链表详解 链表是一种重要的数据结构,它可以动态的分配内存空间,实现灵活的元素插入,删除等操作。本文将详细讲解链表的定义、实现、常见操作以及链表的应用。 定义与特点 链表是一种线性表数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表分为单向链表和双向链表,其中单向链表的每个节点只包含一个指针,指向下一个节点,而双向链表的每…

    数据结构 2023年5月17日
    00
  • Python实现的数据结构与算法之双端队列详解

    Python实现的数据结构与算法之双端队列详解 什么是双端队列? 双端队列是一种具有队列和栈的性质的数据结构,可以在队列两端进行插入和删除操作。双端队列可以实现两端的操作,因此可以在队列两端进行插入和删除操作,既可以像队列一样先进先出,也可以像栈一样后进先出。 双端队列的操作 add_front(item):在队头插入一个元素; add_rear(item)…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之排序总结(二)

    C语言数据结构与算法之排序总结(二) 本篇文章是关于C语言数据结构与算法中排序算法的详细讲解,涉及了八种排序算法。 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。在排序过程中,它会重复地交换相邻的元素,这是它名称的由来。 示例代码: c void bubble_sort(int arr[], int n) { for (int i = 0…

    数据结构 2023年5月17日
    00
  • c语言 数据结构实现之字符串

    下面是详细讲解“c语言 数据结构实现之字符串”的完整攻略。 1. 什么是字符串? 字符串是由一组字符组成的序列,字符可以是字母、数字、标点符号等,字符串常用于文本处理。 在C语言中,字符串是以‘\0’ 结束的字符数组。 2. 字符串的常见操作 常见的字符串操作包括:复制、比较、连接、查找等。 2.1 字符串复制 字符串复制是将一个字符串的内容复制到另一个字符…

    数据结构 2023年5月17日
    00
  • Java数据结构之链表的增删查改详解

    Java数据结构之链表的增删查改详解 简介 链表是非常常用的数据结构之一,它将数据储存在一个个结点中,每个结点存储了它所代表的数据和它下一个结点的指针,通过这些指针链接在一起,形成了一条链。 新建链表 // 定义链表中元素的结构 class ListNode { int val; ListNode next; ListNode(int x) { val = …

    数据结构 2023年5月17日
    00
  • C++高级数据结构之二叉查找树

    C++高级数据结构之二叉查找树 什么是二叉查找树 二叉查找树,也称二叉搜索树(BST,Binary Search Tree),是一种常见的基于二叉树的数据结构,主要用于快速查找与排序。在二叉查找树上,左子树的每个节点都比其根节点小,右子树的每个节点都比其根节点大,同时整棵树也满足二叉树的性质。 二叉查找树的实现 我们可以通过C++语言实现二叉查找树的基本操作…

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