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字符串技巧之删除标点或最后字符的方法

    让我来详细讲解一下“Java字符串技巧之删除标点或最后字符的方法”的完整攻略。 1. 删除标点 1.1 方法一:使用正则表达式 首先,我们可以使用正则表达式来删除字符串中的所有标点符号。具体来说,可以使用replaceAll()方法和正则表达式\\p{Punct}来实现。 示例代码: String text = "This is a sample …

    Java 2023年5月20日
    00
  • JSP中九大内置对象和四种属性范围详解

    让我来详细讲解“JSP中九大内置对象和四种属性范围详解”的完整攻略。 一、JSP中九大内置对象 在JSP中,有九个内置对象可以被直接使用,它们分别是: request:代表客户端的请求对象,可以通过它获取请求的参数。 response:代表服务器对客户端的响应对象,可以通过它向客户端返回响应结果。 session:代表用户会话对象,可以通过它在不同的页面之间…

    Java 2023年6月15日
    00
  • Spring如何集成ibatis项目并实现dao层基类封装

    下面就是详细讲解“Spring如何集成ibatis项目并实现dao层基类封装”的完整攻略。 目录 Spring和iBatis的集成 示例一:使用iBatis进行单表操作 示例二:使用iBatis进行多表操作 Dao层基类封装 Spring和iBatis的集成 Spring和iBatis的集成需要以下几个步骤: 引入Spring和iBatis相关的jar包 配…

    Java 2023年5月20日
    00
  • Spring之详解bean的实例化

    Spring 之详解bean的实例化 在 Spring 中,Bean 就是应用程序中的对象,是应用程序的基本构成单元。Bean 由 Spring 容器管理,Spring 容器实例化、配置和组装这些 Bean。本文将详细讲解 Spring 中 Bean 的实例化。 Bean 的实例化方式 在 Spring 中,Bean 的实例化方式一般有三种: 构造器实例化 …

    Java 2023年5月26日
    00
  • ajax跳转到新的jsp页面的方法

    当用户在网页中进行某些操作,需要展示新的内容时,可以通过跳转到新的jsp页面来实现。Ajax技术可以使这个过程更加流畅和无感知。下面,我将详细讲解“ajax跳转到新的jsp页面的方法”的完整攻略。 1. 前端实现 1.1 创建按钮或链接 首先,在前端页面中添加一个按钮或链接,当点击这个按钮或链接时,将使用Ajax技术跳转到新的jsp页面: <butto…

    Java 2023年6月15日
    00
  • SpringMVC中常用参数校验类注解使用示例教程

    SpringMVC中常用参数校验类注解使用示例教程 在SpringMVC中,参数校验是非常重要的,它可以帮助我们在控制器中对请求参数进行校验,确保数据的有效性和安全性。本文将详细介绍SpringMVC中常用的参数校验类注解,并提供两个示例说明。 常用参数校验类注解 在SpringMVC中,常用的参数校验类注解有以下几种: @NotNull:用于校验参数不为n…

    Java 2023年5月17日
    00
  • @Validated和@Valid三种异常捕获处理方式

    下面是 @Validated 和 @Valid 的详细讲解和异常捕获处理方式攻略: 1. @Validated 和 @Valid 的区别 @Validated 和 @Valid 都是基于 JSR-303 的 Bean Validation 规范来进行数据校验的注解。 @Validated 注解是 Spring 提供的用于参数校验和值校验的注解。它可以让 Sp…

    Java 2023年5月27日
    00
  • 什么是方法区?

    以下是关于 Java 方法区的详细讲解: 什么是方法区? Java 方法区是一种用于存储已加载类信息、常量、静态变量、即时编译器编译后的代码数据的内存区域。方法区是线程共享的,的大小可以通过 -XX:MaxMetaspaceSize 参数进行设置。 Java 方法区使用攻略 使用 Java 方法区,需要注意以下几点: 在程序开发中,需要合理内存,避免出现内存…

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