Stack 栈的实现与应用

news/2025/2/22 20:39:36/

目录

1. 概念

2. 常用的栈的方法

2.1 方法

2.2 代码

3. 自己实现栈

3.1 构造MyStack

3.2 push()

3.3 ensureCapacity()

3.4 pop()

3.5 peek()

3.6 empty()

3.7 szie()

4. 栈的应用


1. 概念

        

栈(Stack)是一种数据结构,是一种特殊的线性表,它是按照后进先出(Last-In-First-Out, LIFO)原则工作的线性数据结构。栈中的插入和删除元素的操作只能在栈顶进行,因此栈也被称为“后进先出表”。栈可以用数组或链表实现。

栈最基本的操作是:入栈(Push)、出栈(Pop)和获取栈顶元素(Top)。其中,入栈操作将元素放到栈顶,出栈操作将栈顶元素移除并返回其值,获取栈顶元素则是获取栈顶元素的值但是不移除栈顶元素。

另外,栈还有一些其他的常用操作,如:判断栈是否为空(IsEmpty)、获取栈中元素的个数(Size)、清空栈中的所有元素(Clear)等。

2. 常用的栈的方法

2.1 方法

方法

功能
push()在栈顶插入元素
pop()删除栈顶元素,并返回该元素的值。如果栈为空,则抛出EmptyStackException异常
peek()返回该元素的值。如果栈为空,则抛出EmptyStackException异常
empty()如果栈为空返回true,或者返回false
size()

返回栈内元素个数

2.2 代码

public static void main(String[] args) {Stack<Character> stack = new Stack<>();//插入A B Cstack.push('A');stack.push('B');stack.push('C');System.out.println(stack.size());//获得栈中元素个数,打印   3System.out.println(stack.pop());//删除并获得栈顶元素 CSystem.out.println(stack.pop());//删除并获得栈顶元素 Bstack.push('D');//栈顶插入DSystem.out.println(stack.empty());
}

注意:

  • 方法push(),pop(),peek()都是在栈顶执行插入,删除以及检索操作。isEmpty()和size()是标准的集合方法。
  • 栈顶操作的pop(),peek()的执行条件是栈不为空。

3. 自己实现栈

3.1 构造MyStack

Stack是动态顺序表,可以使用数组来实现,则我们需要创建一个数组,还可以用一个创建一个变量记录栈内元素大小。

public class MyStack {public int[] elem;public int size = 0;public MyStack(){elem = new int[10];}//...
}

3.2 push()

先进行判断栈的容量大小是否足够,不够进行栈的扩容,在进行压栈,反之,直接压栈,并将记录栈的大小的size加1;

    //入栈、压栈public void push(int val){if(size == elem.length){ensureCapacity();}elem[size] = val;size++;}

3.3 ensureCapacity()

栈中的元素个数不小于容量时,要对容量进行扩容,就是将栈中的元素克隆到更大的数组中。

private void ensureCapacity() {elem = Arrays.copyOf(elem,2 * elem.length);
}

3.4 pop()

出栈的时候要进行判断栈是否为空,如果栈为空,抛出EmptyStackException异常,反之,将栈顶元素删除并抛出,记录栈元素大小的size 减1;

    public int pop(){if(size == 0 ){throw new EmptyStackException();}return elem[--size];}

3.5 peek()

只需要把栈顶元素返回,要进行判断栈是否为空,如果栈为空,抛出EmptyStackException异常。

    //获得栈顶public int peek(){if(size == 0){throw new EmptyStackException();}int key = size - 1;return elem[key];}

3.6 empty()

判断size大小,szie = 0; 则返回true,反之false;

    //检查栈是否为空public boolean empty(){return size == 0;}

3.7 szie()

直接返回size大小;

    //栈内元素的个数public int size(){return size;}

4. 栈的应用

  1. 改变元素的序列
  2. 将递归转化为循环
  3. 括号匹配
  4. 逆波兰表达式求值
  5. 最小栈

这些都是较重要的应用,篇幅较大,我就放在了下篇博客,喜欢的可以点我主页查看。


http://www.ppmy.cn/news/88090.html

相关文章

SQL案例-高校信息管理系统实现要求

SQL案例-高校信息管理系统实现要求 (1) 建表 stuInfo(学生信息表) 字段名称数据类型说明stuName字符学生姓名&#xff0c;该列必填&#xff0c;要考虑姓氏可能是两个字的&#xff0c;如欧阳俊雄stuNo字符学号&#xff0c;该列必填&#xff0c;学号不能重复&#xff0c;且必须…

【ES】---ES的基本操作

目录 一、前言二、Jest client和Rest client使用2.1、Rest client方式三、Rest client方式3.1、基本操作一、前言 ES有4种客户端,分别是:Jest client、Rest client、Transport client、Node client。 ES支持两种协议 HTTP协议,支持的客户端有Jest client和Rest client Nati…

3步轻松获取Pandas DataFrame任意单元格值

在Pandas处理DataFrame数据的过程中&#xff0c;我们时常需要获取某个具体的单元格值进行操作。那么如何高效而灵活地从Pandas DataFrame中提取任意一个单元格的值呢? 今天分享在Pandas DataFrame获取单元格值的3大方法: 第一步:.loc[]方法&#xff0c;传入行列标签 使用.loc…

Java | 一分钟掌握定时任务 | 9 - PowerJob分布式定时任务

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱整理编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 我们选择一套框架或者技术的时候&#xff0c;一定要知道它的特点和…

带你深入理解自定义View和自定义ViewGroup

自定义 View 和自定义 ViewGroup 是 Android 开发中常见的两种自定义视图的方式。它们允许开发者根据自己的需求和设计来创建完全定制的界面元素。下面将详细介绍自定义 View 和自定义 ViewGroup&#xff0c;并对它们的实现和使用进行解析。 一、自定义 View 自定义 View 是指…

Java中常见的垃圾回收器 Serial、Parallel、CMS、G1 和 ZGC简介

Java中有几种常见的垃圾回收器&#xff0c;每种垃圾回收器都有其特定的工作方式和回收策略。下面列举了常见的Java垃圾回收器&#xff0c;并对其进行详细说明。 Serial 垃圾回收器&#xff1a; 回收过程&#xff1a;单线程回收器&#xff0c;使用标记-清除算法。它首先暂停所…

统信UOS系统开发笔记(一):国产统信UOS系统搭建开发环境之虚拟机安装

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/130876940 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

BSN-DDC基础网络详解(十二):算力中心开发者门户部署说明(2)

05 环境准备 环境验证 输出验证命令并展示输出结果&#xff0c;要与基础环境核对无误&#xff0c;包括网络 硬件环境验证 cpu核数验证 cat /proc/cpuinfo | grep -i "model name" | wc -l 内存大小验证 free -h 磁盘大小验证 df -h 输出结果&#xff1a; …