Java 集合框架 Queue 和 Stack 体系

Java 集合框架 Queue 和 Stack 体系

Queue

什么是 Queue

Java 集合框架中的 Queue 接口代表了一种先进先出 (FIFO) 的队列数据结构。该接口继承自 Collection 接口,它是一种有序的集合,允许我们在队尾插入元素,从队头获取元素。在 Queue 中,插入元素的操作称之为 offer(),获取并删除队头元素的操作称之为 poll()。

适用场景

Queue 接口被广泛应用于一些场景,如线程池,消息队列,优先队列等。

示例一:使用 Queue 保存元素并获取

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

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

        queue.offer("element 1");
        queue.offer("element 2");
        queue.offer("element 3");

        System.out.println("队列头元素为:" + queue.peek());
        System.out.println("队列长度为:" + queue.size());

        String head = queue.poll();
        System.out.println("队列弹出的头元素为:" + head);
        System.out.println("队列长度为:" + queue.size());
    }
}

输出:

队列头元素为:element 1
队列长度为:3
队列弹出的头元素为:element 1
队列长度为:2

示例二:使用 Queue 实现消息队列

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

public class MessageQueue {
    private Queue<Message> queue;

    public MessageQueue() {
        queue = new LinkedList<>();
    }

    public void addMessage(Message message) {
        queue.offer(message);
        System.out.println("添加消息:" + message);
    }

    public Message getMessage() {
        Message message = queue.poll();
        System.out.println("取出消息:" + message);
        return message;
    }
}

class Message {
    private String content;

    public Message(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "Message{" +
                "content='" + content + '\'' +
                '}';
    }
}

class QueueExample {
    public static void main(String[] args) {
        MessageQueue messageQueue = new MessageQueue();

        for (int i = 0; i < 10; i++) {
            messageQueue.addMessage(new Message("message " + i));
        }

        for (int i = 0; i < 10; i++) {
            messageQueue.getMessage();
        }
    }
}

输出:

添加消息:Message{content='message 0'}
添加消息:Message{content='message 1'}
添加消息:Message{content='message 2'}
添加消息:Message{content='message 3'}
添加消息:Message{content='message 4'}
添加消息:Message{content='message 5'}
添加消息:Message{content='message 6'}
添加消息:Message{content='message 7'}
添加消息:Message{content='message 8'}
添加消息:Message{content='message 9'}
取出消息:Message{content='message 0'}
取出消息:Message{content='message 1'}
取出消息:Message{content='message 2'}
取出消息:Message{content='message 3'}
取出消息:Message{content='message 4'}
取出消息:Message{content='message 5'}
取出消息:Message{content='message 6'}
取出消息:Message{content='message 7'}
取出消息:Message{content='message 8'}
取出消息:Message{content='message 9'}

Stack

什么是 Stack

Java 集合框架中的 Stack 类代表了一种后进先出 (LIFO) 的堆栈数据结构。它是 Vector 类的一个子类,因此它可以使用 Vector 中的所有方法,同时它还有自己的一些独特的方法,如 push() 和 pop() 等。

适用场景

Stack 类不建议用于复杂的数据结构或高性能的应用程序中使用。但是,它可以很好地处理一些简单的场景,如括号匹配、表达式求值等。

示例一:使用 Stack 实现括号匹配

import java.util.Stack;

public class BracketMatching {
    private static final char LEFT_ROUND_BRACKET = '(';
    private static final char RIGHT_ROUND_BRACKET = ')';

    private static final char LEFT_SQUARE_BRACKET = '[';
    private static final char RIGHT_SQUARE_BRACKET = ']';

    private static final char LEFT_CURLY_BRACES = '{';
    private static final char RIGHT_CURLY_BRACES = '}';

    public static boolean isMatch(String str) {
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);

            if (c == LEFT_ROUND_BRACKET || c == LEFT_SQUARE_BRACKET || c == LEFT_CURLY_BRACES) {
                stack.push(c);
            } else if (c == RIGHT_ROUND_BRACKET) {
                if (stack.empty() || stack.pop() != LEFT_ROUND_BRACKET) {
                    return false;
                }
            } else if (c == RIGHT_SQUARE_BRACKET) {
                if (stack.empty() || stack.pop() != LEFT_SQUARE_BRACKET) {
                    return false;
                }
            } else if (c == RIGHT_CURLY_BRACES) {
                if (stack.empty() || stack.pop() != LEFT_CURLY_BRACES) {
                    return false;
                }
            }
        }

        return stack.empty();
    }

    public static void main(String[] args) {
        String str = "(1+2*[3-{4/(5+6)}]+7)";

        if (isMatch(str)) {
            System.out.println(str + " 括号匹配成功");
        } else {
            System.out.println(str + " 括号匹配失败");
        }
    }
}

输出:

(1+2*[3-{4/(5+6)}]+7) 括号匹配成功

示例二:使用 Stack 实现表达式求值

import java.util.Stack;

public class ExpressionEvaluation {
    public static int calculate(String str) {
        Stack<Integer> stack = new Stack<>();

        int num = 0;
        int sign = '+';

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);

            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0');
            }

            if (!Character.isDigit(c) && c != ' ' || i == str.length() - 1) {
                if (sign == '-') {
                    stack.push(-num);
                } else if (sign == '+') {
                    stack.push(num);
                } else if (sign == '*') {
                    stack.push(stack.pop() * num);
                } else if (sign == '/') {
                    stack.push(stack.pop() / num);
                }
                sign = c;
                num = 0;
            }
        }

        int res = 0;
        while (!stack.isEmpty()) {
            res += stack.pop();
        }

        return res;
    }

    public static void main(String[] args) {
        System.out.println(calculate("1 + 2 * 3 - 4 / 2"));  // 输出 5
    }
}

输出:

5

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 集合框架 Queue 和 Stack 体系 - Python技术站

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

相关文章

  • java中rss解析器(rome.jar和jdom.jar)示例

    一、准备工作 下载并安装Java运行时环境(JRE) 下载jdom.jar和rome.jar两个jar包并添加到项目中 二、使用rome.jar解析rss文件 创建一个URL对象,指向RSS源文件 URL url = new URL("http://example.com/rss.xml"); 使用rome.jar提供的RssFeed对象…

    Java 2023年5月26日
    00
  • Java将excel中的数据导入到mysql中

    下面我将详细讲解“Java将excel中的数据导入到mysql中”的完整攻略。本攻略总体流程分为三步:读取Excel数据、连接MySQL数据库、将数据导入到数据库中。具体过程如下: 1. 读取Excel数据 首先需要使用Java中的一些类库来读取Excel表格数据。在这里我们使用Apache POI类库,它能够帮助我们读取和操作Excel表格文件。 代码示例…

    Java 2023年6月1日
    00
  • java通过反射创建对象并调用方法

    Java的反射机制允许程序在运行时动态地获取类的信息,包括类名、属性、方法等,然后通过反射机制创建对象并调用方法。本文将详细讲解Java通过反射创建对象并调用方法的完整攻略。 一、获取类信息 在Java中,要使用反射机制创建对象并调用方法,首先需要获取类信息。Java中有三种获取类信息的方式: 1.通过类的全限定名获取Class对象 可以使用Class的静态…

    Java 2023年5月26日
    00
  • Spring Boot 集成MyBatis 教程详解

    下面是关于Spring Boot集成Mybatis的详细攻略。 1. 概述 Mybatis是一种非常流行的持久化框架,Spring Boot是一个快速搭建开发环境的框架,将二者结合使用能够快速地实现数据持久化操作。下面介绍如何在Spring Boot中进行Mybatis集成。 2. 添加依赖 在项目的pom.xml文件中添加Mybatis的依赖。示例代码如下…

    Java 2023年6月3日
    00
  • Arthas排查Kubernetes中应用频繁挂掉重启异常

    以下是 Arthas 排查 Kubernetes 中应用频繁挂掉重启异常的完整攻略。 确认场景 首先,需要确认场景。用户反馈应用经常挂掉重启,需要排查问题。该应用运行在 Kubernetes 集群中。需要确定:是所有的节点都有相同的问题,还是只有某个节点有问题。同时,需要定位是否是应用级别的问题。 安装 Arthas 因为需要使用到 Arthas 工具,所以…

    Java 2023年5月20日
    00
  • Java解析json报文实例解析

    下面我来详细讲解“Java解析json报文实例解析”的完整攻略,包含以下几个步骤: 1. 基础知识 在进行 Java 解析 JSON 报文之前,需要先掌握一些基础知识,包括: 什么是 JSON?JSON 是一种轻量级的数据交换格式,可以被多种编程语言解析。 JSON 数据结构:JSON 由键值对或数组组成。 Java 解析 JSON 的库:常用的有 Jack…

    Java 2023年5月26日
    00
  • 如何创建和使用Java类?

    创建和使用Java类可以分为以下几个步骤: 创建一个.java文件,命名为你的类名。例如,我们创建一个名为”Person”的类。 在这个文件中定义这个类的属性和方法。例如,我们为”Person”类定义一个属性”name”和一个方法”sayHello”。 public class Person { private String name; public voi…

    Java 2023年4月27日
    00
  • Java Spring Security认证与授权及注销和权限控制篇综合解析

    Java Spring Security认证与授权及注销和权限控制篇综合解析 什么是Java Spring Security? Spring Security是一个基于Spring框架的安全性框架,目的是为了帮助开发者构建安全性的应用。它提供了诸如认证,授权,攻击防御等安全特性。 认证 Spring Security 认证提供了选择、实现不同的认证方式。本节…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部