Deque取代Stack方案

为什么Java中用Deque实现栈而非Stack? System.out.println("性能提升: " + (stackTime - dequeTime) * 100 / stackTime + "%");System.out.println("Stack操作时间: " + stackTime / 1_000_000 + " ms");System.out.println(name + " 耗时: " + duration / 1_000_000 + " ms");System.out.println("栈大小: " + stack.size()); 阅读详情

该Java项目展示了使用Deque替代Stack的高效方案,主要特点和功能包括:

  • 定义了标准的栈接口,确保代码的可扩展性和规范性
  • 使用ArrayDeque实现高性能的栈操作,相比传统Stack有更好的性能表现
  • 提供了完整的性能测试对比,直观展示两种实现的效率差异
  • 包含实际应用场景演示,如括号匹配检查和表达式反转
  • 采用Maven项目管理,配置了正确的编译和执行插件
  • 代码结构清晰,模块化设计便于维护和扩展

/**
 * 栈接口定义
 * 提供栈的基本操作规范
 */
public interface StackInterface<E> {
    /**
     * 将元素压入栈顶
     */
    void push(E element);
    
    /**
     * 弹出栈顶元素
     */
    E pop();
    
    /**
     * 查看栈顶元素但不弹出
     */
    E peek();
    
    /**
     * 判断栈是否为空
     */
    boolean isEmpty();
    
    /**
     * 获取栈中元素数量
     */
    int size();
    
    /**
     * 清空栈
     */
    void clear();
}

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * 基于Deque的高效栈实现
 * 使用ArrayDeque作为底层数据结构,性能优于传统Stack
 */
public class DequeStack<E> implements StackInterface<E> {
    private final Deque<E> deque;
    
    public DequeStack() {
        this.deque = new ArrayDeque<>();
    }
    
    public DequeStack(int initialCapacity) {
        this.deque = new ArrayDeque<>(initialCapacity);
    }
    
    @Override
    public void push(E element) {
        deque.addFirst(element);
    }
    
    @Override
    public E pop() {
        if (isEmpty()) {
            throw new java.util.EmptyStackException();
        }
        return deque.removeFirst();
    }
    
    @Override
    public E peek() {
        if (isEmpty()) {
            throw new java.util.EmptyStackException();
        }
        return deque.peekFirst();
    }
    
    @Override
    public boolean isEmpty() {
        return deque.isEmpty();
    }
    
    @Override
    public int size() {
        return deque.size();
    }
    
    @Override
    public void clear() {
        deque.clear();
    }
    
    /**
     * 获取底层Deque的字符串表示(用于调试)
     */
    @Override
    public String toString() {
        return deque.toString();
    }
}

import java.util.Stack;

/**
 * 性能测试类 - 对比DequeStack和传统Stack的性能差异
 */
public class StackPerformanceTest {
    private static final int TEST_SIZE = 100000;
    
    public static void testDequeStack() {
        DequeStack<Integer> stack = new DequeStack<>();
        long startTime = System.nanoTime();
        
        // 压入测试
        for (int i = 0; i < TEST_SIZE; i++) {
            stack.push(i);
        }
        
        // 弹出测试
        while (!stack.isEmpty()) {
            stack.pop();
        }
        
        long endTime = System.nanoTime();
        System.out.println("DequeStack 耗时: " + (endTime - startTime) / 1000000 + " ms");
    }
    
    public static void testTraditionalStack() {
        Stack<Integer> stack = new Stack<>();
        long startTime = System.nanoTime();
        
        // 压入测试
        for (int i = 0; i < TEST_SIZE; i++) {
            stack.push(i);
        }
        
        // 弹出测试
        while (!stack.isEmpty()) {
            stack.pop();
        }
        
        long endTime = System.nanoTime();
        System.out.println("传统Stack 耗时: " + (endTime - startTime) / 1000000 + " ms");
    }
}

/**
 * 栈应用示例 - 展示DequeStack的实际使用场景
 */
public class StackApplication {
    
    /**
     * 使用栈进行括号匹配检查
     */
    public static boolean isBracketBalanced(String expression) {
        DequeStack<Character> stack = new DequeStack<>();
        
        for (char ch : expression.toCharArray()) {
            if (ch == '(' || ch == '[' || ch == '{') {
                stack.push(ch);
            } else if (ch == ')' || ch == ']' || ch == '}') {
                if (stack.isEmpty()) {
                    return false;
                }
                
                char top = stack.pop();
                if (!isMatchingPair(top, ch)) {
                    return false;
                }
            }
        }
        
        return stack.isEmpty();
    }
    
    private static boolean isMatchingPair(char left, char right) {
        return (left == '(' && right == ')') ||
               (left == '[' && right == ']') ||
               (left == '{' && right == '}');
    }
    
    /**
     * 使用栈进行表达式反转
     */
    public static String reverseExpression(String expression) {
        DequeStack<Character> stack = new DequeStack<>();
        StringBuilder result = new StringBuilder();
        
        // 压入所有字符
        for (char ch : expression.toCharArray()) {
            stack.push(ch);
        }
        
        // 弹出所有字符实现反转
        while (!stack.isEmpty()) {
            result.append(stack.pop());
        }
        
        return result.toString();
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.example</groupId>
    <artifactId>deque-stack</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <mainClass>Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

/**
 * 主程序入口 - 演示DequeStack的使用和性能优势
 */
public class Main {
    public static void main(String[] args) {
        System.out.println("=== Deque替代Stack的高效实现演示 ===\n");
        
        // 1. 基本功能演示
        demonstrateBasicOperations();
        
        // 2. 性能对比测试
        demonstratePerformance();
        
        // 3. 实际应用场景
        demonstrateApplications();
    }
    
    private static void demonstrateBasicOperations() {
        System.out.println("1. 基本操作演示:");
        DequeStack<String> stack = new DequeStack<>();
        
        // 压入操作
        stack.push("Java");
        stack.push("Deque");
        stack.push("Stack");
        
        System.out.println("栈内容: " + stack);
        System.out.println("栈大小: " + stack.size());
        System.out.println("栈顶元素: " + stack.peek());
        
        // 弹出操作
        System.out.println("弹出: " + stack.pop());
        System.out.println("弹出后栈顶: " + stack.peek());
        System.out.println();
    }
    
    private static void demonstratePerformance() {
        System.out.println("2. 性能对比测试 (操作 " + StackPerformanceTest.TEST_SIZE + " 个元素):");
        
        // 运行性能测试
        StackPerformanceTest.testDequeStack();
        StackPerformanceTest.testTraditionalStack();
        System.out.println();
    }
    
    private static void demonstrateApplications() {
        System.out.println("3. 实际应用场景演示:");
        
        // 括号匹配测试
        String[] testExpressions = {
            "((a + b) * (c - d))",
            "({[()]}))",
            "((())",
            "(){}[]"
        };
        
        for (String expr : testExpressions) {
            boolean balanced = StackApplication.isBracketBalanced(expr);
            System.out.println("表达式 '" + expr + "' 括号" + (balanced ? "匹配" : "不匹配"));
        }
        
        // 表达式反转测试
        String expression = "Hello World";
        String reversed = StackApplication.reverseExpression(expression);
        System.out.println("表达式 '" + expression + "' 反转后: '" + reversed + "'");
    }
}

stack、queue、priority_queue、deque STL 阅读详情

相关推荐

C++STL库的 deque、stack、queue、list、set/multiset、map/multimap

Deque 最大的工作就是维护这些分段连续的内存空间的整体性的假象,并提供随 机存取的接口,避开了重新配置空间,复制,释放的轮回,代价就是复杂的迭代器架构。拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作 时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。某些相同的性质,当对容器中的元素进行插入操作或者删除操作的 时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。对于空间的运用有绝对的精准,一点也不浪费。

weixin_50963877的博客 1984

Java中的栈Stack、Deque、ArrayDeque、LinkedList

文章目录先来说说Java中的Stack类不用Stack至少有以下两点原因该用ArrayDeque还是LinkedList?结论 先来说说Java中的Stack类 Java中Stack类从Vector类继承,底层是用数组实现的线程安全的栈。栈是一种后进先出(LIFO)的容器,常用的操作push/pop/peek。 不过Java中用来表达栈的功能(push/pop/peek),更适用的是适用双端队列接口Deque,并用ArrayDeque/LinkedList来进行初始化。 Deque<Integer&g

编程架构三分天下:分层、分治、分时序。 1万+

Java笔记之Deque与Stack

使用Deque 允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),简称Deque。 Java集合提供了接口Deque来实现一个双端队列,它的功能: ①既可以添加到队尾,也可以添加到队首; ②既可以从队首获取,又可以从队尾获取。 在原来的queue的方法名上加了表示在队首还是队尾操作的表示(Last或First)。 Deque接口实际上扩展自Queue: publ...

来自蒟蒻LebronGod的博客 6337

JAVA 栈,为什么要使用Deque,而不推荐使用Stack,Deque中ArrayDeque与LinkedList的区别,Deque方法详解

ArrayDeque , LinkedList , Stack的关系差不多就是下图那样 Stack实现了Vector接口,LinkKist实现了Deque,List接口,ArrayDeque实现了Deque接口 那为什么不推荐使用Stack? 因为Vector是当初JAVA曾经写得不太行的类,所以Stack也不太行。 Vector不行是因为效率不太行,很多方法都用了synchronized修饰,虽然线程安全,但是像ArrayDeque,LinkedList这些线程不安全的,在需要安全的时候也可以用Coll

LittleWear的博客 1万+

Feko仿真GPS微带天线学习笔记

为了优化方便,使参数变量化,所以定义几个变量在CADFEKO左侧浏览器中如图所示定义变量,如下表贴片的尺寸切角尺寸feed =-6.4馈电点距坐标原点的距离sub_w=45基板的宽度sub_d=45基板的长度sub_h=5基板的高度epsR=5.6介电常数损耗角正切。

qq_36521926的博客 3989

数字逻辑EduCoder课设项目 厨房计时器系统设计 Logisim实现

数字逻辑EduCoder课设项目 厨房计时器系统设计 Logisim实现

weixin_51693702的博客 1万+

【C++】—— stack & queue & deque

C++STL系列

yusjushd的博客 1469

ArcMap 10.7/10.8启动加载界面后闪退?可能是这个隐藏的Normal.mxt模板文件在搞鬼

本文深入分析了ArcMap 10.7/10.8启动加载界面后闪退的问题,指出Normal.mxt模板文件损坏是常见原因。提供了从定位、删除模板文件到系统级修复的完整解决方案,帮助GIS工程师快速恢复工作流程。

weixin_28523493的博客 330

Java中Deque与Stack的深度对比:为何官方推荐用Deque替代Stack?

在Java中,栈(Stack)是一种典型的“后进先出”(LIFO)数据结构,常用于实现撤销操作、函数调用栈等场景。尽管Java早期提供了`Stack`类,但官方文档中明确指出应优先使用`Deque`接口实现栈结构。本文将深入对比`Deque`与`Stack`的设计、性能、使用场景及最佳实践,帮助开发者理解两者的核心差异。

weixin_44435110的博客 1319

工业金属表面缺陷检测:4种光学成像方案(明/暗/漫/背光)选型与实测对比

本文深入探讨工业金属表面缺陷检测中的4种光学成像方案(明/暗/漫/背光),详细解析其物理原理、适用场景及实测效果。通过对比不同照明方案在铝合金轮毂、不锈钢餐具等实际工业场景中的表现,提供科学的选型决策树,帮助提升缺陷检出率至99%以上,为计算机视觉在工业质检领域的应用提供实用指南。

weixin_33624741的博客 388

电脑版微信多开,最详细教程没有之一

首先桌面任意的位置右键新建文本文档输入如下代码: TASKKILL /F/IM WECHAT.EXE start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" ...

大超子 4390

Java 为什么推荐用Deque实现Stack

Java推荐使用 Deque stack = new ArrayDeque() 代理Stack类实现栈结构的原因

知其所以然 1767

28、基准剂量法:原理、应用与计算详解

本文详细介绍了基准剂量法(BMD)的原理、在监管机构中的应用以及具体的计算方法。内容涵盖样本量与BMD的关系、主要监管机构如EPA对BMD的应用、BMD的模型选择与数据拟合过程、拟合优度评估、下置信限(BMDL)计算,以及实验设计对BMD结果的影响。同时,还讨论了剂量指标和响应选择的关键问题,为理解和应用基准剂量法提供了全面的参考。

info6的博客 280

【C++】stack与queue和deque

stack与queue的介绍使用和模拟实现,deque的了解及对比

关注学习C++领域,感谢陪伴,共同进步! 1644

华为OD机试双机位C卷:流量波峰 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 流量波峰,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 流量波峰。

qq_45776114的博客 2445

90. 将 SAP ABAP 内表内容本地导出成 Excel 文件

这里文件扩展名为 csv,全称是 Comma-Separated Values,意思是这种类型的文件内容,由逗号分隔。除了 ASC 之外,另一个可用的选项是 BIN,适用于 PDF,EXE 等二进制文件的导出。支持海量的输入和输出参数,我们这个简单的本地导出场景里,大部分参数都用不上。这个分隔符的添加逻辑,编写在上图红色高亮矩形框内,使用的语法是。本教程有学习者向我提问,询问如何将 ABAP 某某函数的某某输出参数的值,导出成本地 Excel 文件。把这个内表的内容,下载到本地,以本地文件的方式保存。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1742

STL中的stack、queue以及deque

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作pop_back:尾部删除元素操作。

weixin_50470247的博客 1548

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

深入探究C++ 中的stack、queue和deque

C++中 deque 的注意事项及示例:1. 迭代器失效:在 deque 中插入或删除元素后,除了指向被删除元素的迭代器外,其他迭代器可能仍然有效,但可能会导致迭代器重新定位。cpp// 插入元素后,迭代器it仍然有效return 0;1. 容量和内存管理: deque 的内存管理相对复杂,它通过分段连续内存实现。与 vector 相比, deque 在头部插入和删除元素更高效,因为不需要移动大量元素来调整内存。cppi < 10;++i) {

nplplus的博客 1632

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【STL】stack,deque,queue 基础,应用与操作

stack(栈)栈是一种后进先出(LIFO, Last In First Out)的数据结构,意味着最后插入的数据最先被移除。C++ 中的栈是通过容器适配器实现的,底层默认使用 deque(双端队列)来实现,也可以选择 vector 或 list 作为底层容器。数据结构:后进先出(LIFO,Last In First Out),意味着最后插入的元素最先被移除。底层实现:stack 是一个容器适配器,默认底层使用 deque 实现,可以替换为 vector 或 list。

2401_82676816的博客 1425

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【C++】STL中stack、queue、deque的使用

在C++中,deque(双端队列)是一种线性容器,允许在两端进行插入和删除操作。deque是 “double-ended queue” 的缩写。deque类似于vector,但不同之处在于deque允许在容器的前端和后端进行高效的插入和删除操作,而vector只支持在末尾进行插入和删除操作。deque还提供了随机访问元素的能力,类似于数组。deque的主要特点包括:在两端进行高效的插入和删除操作。随机访问元素的能力。动态分配存储空间,自动扩展和收缩容量。

m0_64826370的博客 916

JAVA 中栈,为什么要使用Deque,而不推荐使用Stack

一、概念1. 概念双端队列(Deque)是Quene是一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队(push)和出队(pop),则可限制栈的数据结构。对于栈而言,有入栈,遵循先进后出原则。2. 双端队列的使用(在实际使用中,Deque接口使用的是比较多的,栈和队列都可以使用该接口,这个接口中有栈的方法,也有队列的方法)Quene以及Deque都是继承于Collection,Deque是Quene的子接口。

qq_40222433的博客 1928

Stack、Queue and Deque

1.适配器的概念: 封装一个已有对象,转换其接口 2.容器适配器: 封装一个已有容器对象,转换其容器对象的接口 3.容器适配器中没有迭代器 (1)行为约束,保证栈后进先出和队列先进先出行为 (2)安全保证,避免破坏内部结构,如:priority_queue的堆序性 4.适配器模式: 封装旧对象 + 接口转换层

2401_89521529的博客 827

java 中的Stack、Queue、Deque

1.Stack java集合框架中没有Stack接口,仅仅有java早期遗留下来的一个Stack类。 Java.util.Stackpublic Stack extends Vector 因为集成自Vector,所以Stack类是同步的,效率不高。官方一般建议这样使用ArrayDeque代替Stack Deque stack = new ArrayDeque(); 2.Queue

知之可否 1万+

Java中的栈Stack、Deque、ArrayDeque、LinkedList的区别

Java中的栈Stack、Deque、ArrayDeque、LinkedList的区别Stack类那么为什么我们不选择Stack呐?(两个主要原因)那么我们应该使用ArrayDeque还是LinkedList呐?总结 Stack类 Java中Stack类底层是数组实现的线程安全的栈。先进后出,常用操作是push/pop/peek 而Deque是更加适用的双端队列接口,其通过ArrayDeque/LinkedList初始化实现 Deque<Integer> stack = new ArrayDeq

qq_37509948的博客 2万+

【C++】stack|queue|deque

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。判空操作获取尾部元素操作尾部插入元素操作尾部删除元素操作标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。

悟已往之不谏 知来者之可追 1242

Java容器之Stack和Deque

Java容器之Stack和Deque Stack Java的集合类并没有单独的Stack接口,有一个遗留类叫做Stack(栈,后进先出)。主要方法如下图所示: 在Java Doc里建议使用Deque接口替代Stack完成栈的功能,为什么呢? 因为Stack是继承Vector,Vector是由数组实现线程安全(方法使用synchronized修饰)的集合类,它包含了大量集合处理的方法,而Stack复用了Vector的方法实现进栈和出栈的操作,基于数组实现相比于链表实现,效率上受影响。同时,因为继承Vect

Black的博客 2017
上一篇: docker命令记录(一)
下一篇: Arthas单独记录篇二——命令
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值