基于数组实现Java 自定义Stack栈类及应用

Java:实现ArrayStack数组堆栈算法(附完整源码) 阅读详情

栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出( Last-in-first-out,LIFO)的原则。java本身是有自带Stack类包,为了达到学习目的已经更好深入了解stack栈,自己动手自建java stack类是个很好的学习开始:

自建Java Stack 类

Stack 类:

package com.stack;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * Stack Class
 * @author ganyee
 *
 */
public class Stack {
    //Define capacity constant:CAPACITY
    private static final int CAPACITY = 1024;
    //Define capacity
    private static int capacity;
    //Define the top position of stack 
    //top = -1 meaning that the stack empty
    private static int top = -1;
    //Basic Object class array
    Object[] array;
    //Initialize the capacity of stack
    public Stack() {
        this.capacity = CAPACITY;
        array = new Object[capacity];
    }

    //Get the size of stack
    public int getSize(){
        if(isEmpty()){
            return 0;
        }else{
            return top + 1;
        }
    }

    //Get whether stack is empty
    public boolean isEmpty(){
        return (top < 0);
    }

    //Get the top element of stack
    public Object top() throws ExceptionStackEmpty{

        if(isEmpty()){
            throw new ExceptionStackEmpty("Stack is empty");
        }
        return array[top];

    }

    //Push element to stack
    public void push(Object element) throws ExceptionStackFull{
           if(getSize()== CAPACITY){
               throw new ExceptionStackFull("Stack is full");
           }
           array[++ top] = element;
    }

    //Pop element from stack
    public Object pop() throws ExceptionStackEmpty{
        if(isEmpty()){
            throw new ExceptionStackEmpty("Stack is empty");
        }
        return array[top --];
    }

    //Get the all elements of stack
    public String getAllElements() throws ExceptionStackEmpty{
        String[] arr = new String[top + 1];
        if(!isEmpty()){
            for(int i = 0;i < getSize();i ++){
                arr[i] = (String)array[i];
            }
        }
        return Arrays.toString(arr);
    }
}

自定义ExceptionStackEmpty异常类(关于如何自定义异常类可以看相关博客)

package com.stack;

public class ExceptionStackEmpty extends Exception {

    //Constructor
    public ExceptionStackEmpty(){

    }

    //Define myself exception construct with parameters
    public ExceptionStackEmpty(String string){
        super(string);
    }
}

自定义ExceptionStackFull异常类

package com.stack;

public class ExceptionStackFull extends Exception {

    //Constructor
        public ExceptionStackFull(){

        }

        //Define myself exception construct with parameters
        public ExceptionStackFull(String string){
            super(string);
        }
}

测试类:

package com.stack;

public class StackTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Stack stack= new Stack();
        System.out.println(stack.getSize());
        System.out.println(stack.isEmpty());
        try {
            stack.push(8);
            stack.push(3);
            stack.push(4);
            stack.push(7);
            stack.push(1);
            stack.push(8);
            stack.push(3);
            stack.push(4);
            stack.push(7);
            stack.push(1);
            System.out.println(stack.getSize());
            System.out.println(stack.top());
            System.out.println(stack.getAllElements());

            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());
            System.out.println(stack.pop());

        } catch (ExceptionStackFull e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (ExceptionStackEmpty e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

测试结果:

0
true
10
1
[8, 3, 4, 7, 1, 8, 3, 4, 7, 1]
1
7
4
3
8
1
7
4
3
8

栈的应用:符号匹配

下面,我们将借助一个栈结构 S,通过对算术表达式自左向右的一遍扫描,检查其中的括号是否匹配。
假设算术表达式为 X = “x0x1x2…xn-1”,其中 xi 可以是括号、常数、变量名或者算术运算符。我们依次检查 X 中的各个符号,非括号的符号都可以忽略。若遇到左括号,则将其压入栈 S 中;若遇到右括号,则将栈顶符号弹出并与该右括号对比。如果发现某对括号不匹配,或者遇到右括号时栈为空,或者整个表达式扫描过后栈非空,都可以断定括号不匹配。
在按照以上规则扫描完所有字符后,若栈为空,则说明括号是匹配的。如果按照前面对栈的实现,每一 push()和 pop()操作都只需常数时间,因此对于长度为 n 的算术表达式,上述算法需要运行 O(n)的时间。
该算法的伪代码描述如 算法二.1 所示:

这里写图片描述

package com.stack;

public class MatchClass {

    public static boolean Match(String str) throws ExceptionStackFull, ExceptionStackEmpty{
        Stack stack = new Stack();
        str = str.replaceAll(" ","");
        char s;
        for(int i = 0;i < str.length();i ++){
            if(str.charAt(i) == '(' || str.charAt(i) == '{' || str.charAt(i) == '[')
                stack.push(str.charAt(i));
            else{
                if(stack.isEmpty())
                    return false;
                else{
                    s = str.charAt(i);
                    switch(s){
                    case ')':
                        if((Character)stack.pop() != '(')
                            return false;
                        break;
                    case '}':
                        if((Character)stack.pop() != '{')
                            return false;
                        break;
                    case ']':
                        if((Character)stack.pop() != '[')
                            return false;
                        break;
                    }
                }

            }
        }
        if(stack.isEmpty()){
            return true;
        }else{
            return false;
        }
    }
}
package com.stack;

public class ParentMatch {

    public static void main(String[] args) {

        MatchClass match = new MatchClass();
        //String str = "()({})";  //Match
        //String str = "()({}) {([()[]])}";//Match
        //String str = "([]{)";//Not match
        //String str = ")([()] {}";//Not match
        String str = "([())]{}";//Not match
        try {
            if(!match.Match(str)){
                System.out.println(str + ": Not Macth");
            }else{
                System.out.println(str + ": Macth");
            }
        } catch (ExceptionStackFull e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExceptionStackEmpty e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

测试结果:

()({}): Macth
()({}) {([()[]])}: Macth
([]{): Not Macth
)([()] {}: Not Macth
([())]{}: Not Macth

文章参考:数据结构与算法( Java 描述)邓俊辉 著
转载请注明出处,谢谢!
http://blog.youkuaiyun.com/github_27609763/article/details/46420149

ArrayStack数组堆栈算法实现(Java) 堆栈(Stack)是一种非常有用的数据结构,它在许多算法和应用中都有广泛的应用。堆栈(Stack)是一种常见的数据结构,它遵循先进后出(LIFO)的原则。在Java中,我们可以使用数组(Array)来实现堆栈。首先,我们需要定义一个ArrayStack类,并声明一个数组作为堆栈的容器。我们还需要维护一个指针,指向堆栈的顶部元素。在上述代码中,我们使用了泛型(generic)来使得堆栈可以存储任意类型的元素。通过以上测试,我们可以确认我们的ArrayStack类的实现是正确的。方法用于将元素压入堆栈, 阅读详情

相关推荐

Obsidian跨设备同步实战:阿里云OSS与Remotely Save插件配置指南

本文详细介绍了如何利用阿里云OSS对象存储与Remotely Save插件,为Obsidian笔记软件搭建一个低成本、高可靠性的私有化多端同步方案。从创建OSS Bucket、配置CORS规则、生成子账户密钥,到插件安装与多设备同步策略,提供了完整的实战配置指南,有效解决Obsidian用户的跨设备同步痛点。

qsc901234567的博客 1282

【数据结构】- 栈

栈(Stack) 是一种 后进先出(LIFO:Last In First Out) 的数据结构。

yzx3105的博客 532

C#串口通讯实战:如何用SerialPort类搞定工业传感器数据采集(附完整代码)

本文详细介绍了如何使用C#的SerialPort类实现工业级传感器数据采集,涵盖串口通讯基础配置、数据帧处理、异常恢复机制及性能优化策略。通过实战代码示例,帮助开发者构建稳定可靠的工业数据采集系统,特别适合需要处理高频数据采集和复杂工业环境的场景。

weixin_42525551的博客 1084

Java-ArrayStack实现

文章目录1.实现Stack接口2.实现ArrayStack2.1 ArrayStack的属性:2.2 ArrayStack的方法: 1.实现Stack接口 public interface Stack<E> extends Iterable<E> { public int size();//获取栈中元素个数 public boolean isEmpty(); //入栈 进栈一个元素 在线性表的表尾添加一个元素 public void push(E el

weixin_45565886的博客 707

基于ensp大学网络规划与设计(完整文档+ensp拓扑图)

大家好,我是小华学长,一名计算机领域的博主。经过多年的学习和实践,我积累了丰富的计算机知识和经验,在这里我想与大家分享我的学习心得和技巧,帮助你成为更好的程序员。 作为一名计算机博主,我一直专注于编程、算法、软件开发等领域,在这些方面积累了大量的经验。我相信分享是一种双赢的方式,通过分享,我可以帮助他人提升技术水平,同时也能够得到学习交流的机会。 在我的文章中,你将会看到我对于各种编程语言、开发工具以及常见问题的解析和分析。我会结合自己的实际项目经验,为你提供实用的解决方案和优化技巧。我相信这些经验不仅能够

qq1325513482的博客 5万+

【Claude】媒体文件处理错误:PDF 与 Image 过大的检测与预处理方法 bug报错已解决

图片压缩是必须的:原始图片的 base64 会占用大量 TokenPDF 提取文本优于传图片:文本版 PDF 比扫描版更省 Token分块处理大文件:不要一次性处理整个大文件控制分辨率:800x800 通常足够 Claude 分析。

博客 6359

数据结构入门-2-栈和队列

Stack 栈也是一钟线性结构 相对于数组,栈对应的操作是数组的子集 只能从栈顶添加元素,也只能从栈顶取出取出元素 后进先出(LIFO) 作用强大 栈的实现 ...

ifeng 436

MALTAB程序利用质心法去寻峰

质心法的优点是简单易实现且计算速度快,适用于数据点较少或峰值较明显的情况。然而,对于复杂的数据或多峰曲线,质心法可能无法准确识别所有峰值,因此在这些情况下可能需要使用更复杂的峰值检测算法。质心法(Centroid Method)是一种寻找峰值的方法,其基本原理是通过计算数据窗口内的质心位置来确定峰值的位置。质心是指在一维数据中,按照数据的幅值对位置进行加权平均的结果,即质心位置为数据幅值加权平均值的位置。变量定义了计算质心的窗口大小。最后,绘制了找到的峰值位置和幅值点,并显示了找到的峰值位置和幅值的结果。

走向CTO的路上... 1345

java中自己定义一个栈类_基于数组实现Java 自定义Stack栈类及应用

栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出( Last-in-first-out,LIFO)的原则。java本身是有自带Stack类包,为了达到学习目的已经更好深入了解stack栈,自己动手自建java stack类是个很好的学习开始:自建Java Stack 类Stack 类:1 packagecom.stack;23 importjava.util.ArrayList...

weixin_36352523的博客 324

Ubuntu系统下MRIcroN、FSL6.0.5、Freesurfer7.1.1、ANTs、MRtrix3、AFNI的安装详解——核磁共振数据处理必备

Ubuntu系统下MRIcroN、FSL6.05、Freesurfer7.1.1、MRtrix3、AFNI、ANTs的安装详解一、安装MRIcroN二、 FSL6.0.5完整安装与FSLeyes等Not Found修复Anaconda与虚拟环境(所有操作均在root下)获取最新版Anaconda3安装Anaconda3配置所有用户可用去掉恼人的base创建虚拟环境FSL与FSLeyes安装(所有操作均在root下)下载FSL安装FSL添加环境变量到/etc/bash.bashrc末尾 (ubuntu)或者

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 6083

AI Agent开发第84课-paddleocr-vl全网唯一最全本地化布署教程

本文详解 PaddleOCR-VL 本地化布署全过程,指出为何在真实生产环境中 PaddleOCR-VL 更稳定、更易部署、更贴近工程落地。同时还会详细比较与 DeepSeek-OCR 的核心差异,为全网独家介绍paddleocr-vl的本地部署实战指南。

打造全国最全的AI Agent开发知识领域的博客 5966

自定义实现Java Stack栈

写在前面 从某种角度来说,栈的FILO(first in last out)特性是一个非常有用的特性,正是这样的特性,让栈变得格外重要。 所谓的FILO就是先进后出,先进来的元素后出去,后进来的元素先出去,就如同下图中一般。 而在Java中,Java类库已经为我们提供来了Stack类来实现栈,并且这个Stack类是范型类,它可以存储不同的数据类型。 那么接下来我们就来看一下,Java为我们提供了哪些Stack类方法。 ...

野犬17的博客 768

YOLO11-pose关键点检测:训练实战篇 | 自己数据集从labelme标注到生成yolo格式的关键点数据以及训练教程

教会你如何用自己的数据集转换成对应格式的数据集以及如何训练YOLO11-pose关键点检测

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 5416

Java中的栈

栈是一种遵循后进先出(LIFO,Last In First Out)原则的数据结构。在栈中,最后进入的元素会最先被移除。这种特性使得栈在许多算法和程序设计中非常有用,例如在处理函数调用、表达式求值和内存管理等方面。在Java中,除了使用内置的Stack类,我们可以通过不同的数据结构来实现栈。栈作为一种基本的数据结构,在Java编程中扮演着重要的角色。无论是内置的Stack类,还是自定义的栈实现,都能帮助我们解决各种编程问题。理解栈的原理和应用,对于提高编程能力和解决复杂问题具有重要意义。版权声明。

ning的博客 925

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java数据结构——栈和队列的简单实现

1、栈 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 public class Stack { private int[] arr; private int flag = 0; public Stack(int

Ez4Sterben的博客 791

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

算法通关村第四关——如何基于数组(链表)实现栈

栈的基础和自定义栈

weixin_47474875的博客 305

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java数据结构——栈的方法与模拟实现_java在堆上面模拟栈

可以看出栈的先进后出的特点。

2401_84181309的博客 295

《Java数据结构与算法:提升代码效率的关键-栈篇》

栈是一种重要的线性数据结构,遵循后进先出(LIFO, Last In First Out)原则。下面详细介绍Java中栈的实现和使用方法。

ljb_53421的博客 317

数据结构--栈详解

数据结构栈详解和模拟实现

2302_81982408的博客 840

②泡茶看<数据结构>,喜欢看源码-栈ADT

前言   听着天籁,我是个音乐迷。时间充实着,会过得很快。我马上也可以到傍晚的时候去乐室吹我心爱的萨克斯。                                            嘟嘟嘟... 我会吹一首简单的歌咯,哈哈我想到了一个神奇的比喻,待会说。 栈ADT模型(又称LIFO表)   栈(stack)插入和删除只能在一个位置上进行的表。该位置是表的末端但是叫做栈的顶(...

weixin_33985679的博客 108

【JavaSE与数据结构】栈与Stack类

本篇文章带大家认识Java集合——Stack,Stack就是栈的意思,是一种数据结构,又叫先进后出表,本文首先会介绍数据结构《栈》,了解清楚栈的特点与性质,然后会根据栈的性质简单来模拟栈以及集合框架Stack类常见方法的使用。 Tips:数据结构——链表,在博主的历史文章中介绍过并通过Java和C语言都实现模拟过,所以对链表不再多赘述,集合框架中LinkedList类底层就是使用双链表实现的,因此在Java中可以使用LinkedList对象来使用链表,如果对链表不了解,可以去博主数据结构与算法专栏了解。

未见花闻的博客 1755

Java中栈(Stack)

栈像一个客栈一般,为数据提供歇脚的地方,从概念,方法理解栈,模拟实现栈 或许你会有一天怀念,可是我已不再—    小镇姑娘 DT

LL_break的博客 2804

Java Coder为什么不建议使用Stack类来实现栈功能

最近在做Leetcode算法题的时候,发现了一个有趣的问题。当需要用到栈这种数据结构时,在java题解中,有的人使用的Stack类来实现,有的人使用LinkedList来实现,还有的人使用Queue或者Deque来实现。 对于我这个菜鸡来说,小小的脑袋大大的问号,为了查清楚到底哪种写法是规范化的写法,本菜鸡在查看了很多技术文章后,终于理清了思路。 下面直接贴一下我觉得总结的很全面的一篇微信公众号文章,希望能帮助到有同样问题的小伙伴。 以下是原文 在 Leetcode 的交流区,可以看到这样的一个讨.

qq_39144436的博客 1493

栈与stack

虽然栈的方法不是很多,但是栈这种独特的思想在编程题目中有着不少的应用,大家可以找两个感受感受~到这里我的分享就先结束了~,希望对你有帮助我是dylan 下次见~无限进步。

2402_89003542的博客 1092

栈(Stack)的2种实现——数组、链表(Java)

本文将介绍栈的特点,以及栈的2种实现方式:数组实现栈和链表实现栈。

卜大爷的博客 2万+

Stack与栈(Java语言)

Stack与栈(Java语言)

qq_57563254的博客 756
上一篇: Java基础笔记 – Java中的Exception异常 自定义异常
下一篇: 基于数组实现Java 自定义Queue队列及应用
YatKam
博客等级 码龄12年 58粉丝 49原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值