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日

相关文章

  • Java concurrency集合之LinkedBlockingDeque_动力节点Java学院整理

    Java Concurrency集合之LinkedBlockingDeque_动力节点Java学院整理 LinkedBlockingDeque是什么? LinkedBlockingDeque是java.util.concurrent包下一个双向阻塞队列,用于在多线程的环境中处理元素序列,它支持在队列两端添加和移除元素。LinkedBlockingDeque可…

    数据结构 2023年5月17日
    00
  • Java数据结构之HashMap和HashSet

    Java数据结构之HashMap和HashSet HashMap 介绍 HashMap是一种基于哈希表实现的Map集合,它提供了快速的插入、查询、删除操作。HashMap中存储的元素是以键值对(Key-Value)的形式存储的,其中Key是用来从Map中查找值的索引,Value是存储在Map中的值。HashMap中的Key和Value都可以为null,但是在…

    数据结构 2023年5月17日
    00
  • 2021最新Android笔试题总结美团Android岗职能要求

    2021最新Android笔试题总结和美团Android岗职能要求 简介 本文主要介绍了2021最新的Android笔试题总结和美团Android岗职能要求,旨在为正在面试美团Android岗位的面试者提供参考。 笔试题总结 下面是近期美团Android面试中出现的一些笔试题目: 1. 请描述Android中BroadcastReceiver的生命周期。 安…

    数据结构 2023年5月17日
    00
  • C语言实现带头结点的链表的创建、查找、插入、删除操作

    C语言实现带头结点的链表的创建、查找、插入、删除操作攻略 一、链表基本概念 链表是一种动态的数据结构,它可以在运行时动态地分配内存,支持数据的插入、删除等操作。链表(Linked List)由多个节点(Node)组成,每个节点包含两部分,一个是数据部分(Data),另一个是指向下一个节点的指针(Next)。 二、带头结点的链表 带头结点的链表是一种特殊的链表…

    数据结构 2023年5月17日
    00
  • java 数据结构之堆排序(HeapSort)详解及实例

    Java 数据结构之堆排序(HeapSort)详解及实例 什么是堆排序 堆排序是一种树形选择排序,它的特点是不需要建立临时数组存放已排序的元素,而是直接在原数组上进行排序,因此空间复杂度比较小,时间复杂度为 $O(nlogn)$。 堆排序中需要用到的数据结构是堆,它是一种特殊的二叉树。堆分为大根堆和小根堆,大根堆满足任何一个非叶子节点的值都不小于其子节点的值…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法之栈(动力节点Java学院整理)

    Java数据结构与算法之栈攻略 什么是栈? 栈是一种线性结构,属于“先进后出”(Last In First Out,LIFO)的数据结构。它只允许在栈顶进行插入和删除操作。 栈的实现 栈的实现有两种方式: 基于数组实现的顺序栈(ArrayStack) 基于链表实现的链式栈(LinkedStack) 1. 基于数组实现的顺序栈 顺序栈的实现需要一个固定大小的数…

    数据结构 2023年5月17日
    00
  • Leetcode Practice — 栈和队列

    目录 155. 最小栈 思路解析 20. 有效的括号 思路解析 1047. 删除字符串中的所有相邻重复项 思路解析 1209. 删除字符串中的所有相邻重复项 II 思路解析 删除字符串中出现次数 >= 2 次的相邻字符 剑指 Offer 09. 用两个栈实现队列 239. 滑动窗口最大值 思路解析 155. 最小栈 设计一个支持 push ,pop ,…

    算法与数据结构 2023年4月17日
    00
  • C++抽象数据类型介绍

    C++抽象数据类型介绍 什么是抽象数据类型? 抽象数据类型(Abstract Data Type,ADT),是数据类型的一个数学模型。它实现了数据类型的抽象过程,将数据与操作分离,使得操作具有独立性,而数据只作为函数参数和返回值存在。 举个例子,ADT可以定义一个栈(Stack),栈的实现需要以下操作: 初始化栈 压入数据 弹出数据 获取栈顶数据 检查栈是否…

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