数据结构-线性表之堆栈

2023-11-15

什么是栈?

是一种数据结构,能够实现后进先出的一种业务场景。即栈中的元素被处理时,按后进先出的顺序进行。所以栈又叫做后进先出表(LIFO);
例子:生活中的叠放在厨房桌子上的碗就是一种栈结构。放的时候只能把碗放在最上面,取的时候只能从最上面开始取。
例图:
这里写图片描述


栈结构的应用有 表达式求值,函数调用及递归实现,深度优先算法,回溯算法等等….


栈的抽象类型描述:

类型名称:堆栈(Stack)
数据对象集:一个有0个或多个元素组成的有穷线性表。
操作集:长度为MaxSize的堆栈S∈Stack, 堆栈元素Item∈ElementType
1.Stack CreakStack(int MaxSize); 生成空堆栈,其最大长度为MaxSize;
2.int IsFull(Stack S,Int MaxSize); 判断堆栈是否已满。
3.void Push(Stack S,ElementType item); 将元素压入堆栈
4.int isEmpty(Stack S); 判断堆栈是否为空
5.ElementType pop(Stack s); 删除并返回栈顶元素


栈的顺序存储实现:

package com.simon.datastructure.javadatastructure;

/**
 * auther: Simon zhang
 * Emaill:18292967668@163.com
 *
 * 基于数组的Stack的实现
 */
public class ArrayStack<E>{
    /**
     * 用于存储栈元素的数组
     */
    Object[] elements;
    /**
     * 用于表示栈顶元素的下表
     */
    int top;
    /**
     * 用于表示栈的容量
     */
    int maxSize;
    /**
     * 生成空堆栈,其最大长度为MaxSize
     * @param maxSize
     */
    public ArrayStack(int maxSize) {
        if(maxSize<0){
            throw  new IllegalArgumentException("stack size must more than zero..");
        }
        this.maxSize = maxSize;
        this.top=-1;
        this.elements=new Object[maxSize];
    }

    /**
     * 判断堆栈是否已满
     */
    public boolean isFull() {
        return top==(maxSize-1);
    }

    /**
     * 将元素压入堆栈
     * @param e
     */
    public void push(E e){
        if(isFull()){
            System.out.println("stack is full now..");
        }else{
            elements[++top]=e;
        }
    }

    /**
     *  删除并返回栈顶元素
     */
    @SuppressWarnings("unchecked")
    public E pop(){
        if(isEmpty()){
            System.out.println("stack is empty now..");
            return null;
        }else{
            //这个unchecked cast异常怎么解决?
            E popE=(E) elements[top];
            elements[top]=null;
            top--;
            return popE;
        }
    }

    /**
     * 将元素压入堆栈
     */
    public boolean isEmpty(){
        return top==-1;
    }


    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (int i = 0; i <top+1; i++) {
            sb.append(elements[i].toString());
            if(i!=top){
                sb.append(',');
            }
        }
        sb.append(']').toString();
        return  sb.toString();
    }
}

栈的链式存储实现:

package com.simon.datastructure.javadatastructure;

/**
 * auther: Simon zhang
 * Emaill:18292967668@163.com
 *
 *  栈结构的链式存储方式实现
 */
public class LinkedStack<E>{
    /**
     * 头节点
     */
    Node<E> header;

    /**
     * 栈的容量
     */
    int maxSize;

    /**
     * 当前节点数量
     */
    private  int size;

    public LinkedStack(int maxSize) {
        this.maxSize = maxSize;
    }

    /**
     * 判断堆栈是否已满
     */
    public boolean isFull() {
        return size==maxSize;
    }

    /**
     * 将元素压入堆栈
     * @param e
     */
    public void push(E e){
        if(isFull()){
            System.out.println("stack is full now..");
        }else{
            Node<E> insertNode = new Node(e);
            insertNode.first=header;
            header=insertNode;
            size++;
        }
    }

    /**
     *  删除并返回栈顶元素
     */
    @SuppressWarnings("unchecked")
    public E pop(){
        if(isEmpty()){
            System.out.println("stack is empty now..");
            return null;
        }else{
            E item= header.item;
            header=header.first;
            size--;
            return item;
        }
    }

    /**
     * 将元素压入堆栈
     */
    public boolean isEmpty(){
        return size==0;
    }


    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        Node temp=header;
        while (temp.first!=null){
            sb.append(temp.item.toString());
            sb.append(',');
            temp=temp.first;
        }
        sb.append(temp.item.toString());
        sb.append(']').toString();
        return  sb.toString();
    }


    class Node<E>{
        E item;
        Node first;
        public Node(E item) {
            this.item = item;
        }

        public void addFirst(Node next) {
            this.first = next;
        }
    }

}

堆栈知识总结:
栈结构实现的方式相对比较简单,但是这种数据结构在软件开发过程中有很多的应用场景,值得我们认真学习掌握。

参考:
1.中国大学数据结构课程(浙江大学)
2. http://blog.csdn.net/chenleixing/article/details/42392283

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构-线性表之堆栈 的相关文章

  • Hibernate注解放置问题

    我有一个我认为很简单的问题 我见过两种方式的例子 问题是 为什么我不能将注释放在字段上 让我举一个例子 Entity Table name widget public class Widget private Integer id Id G
  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • 是什么决定了从 lambda 创建哪个函数式接口?

    请考虑这个例子 import java util function Consumer public class Example public static void main String args Example example new
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • Java:迭代 Collection 的最佳方法(此处为 ArrayList)

    今天 当我看到一段我已经使用了数百次的代码时 我很高兴地开始编码 迭代集合 此处为 ArrayList 出于某种原因 我实际上查看了 Eclipse 的自动完成选项 这让我想知道 在什么情况下以下循环比其他循环更好使用 经典的数组索引循环
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 我可以使用子接口重新编译公共 API 并保持二进制兼容性吗?

    我有一个公共 API 在多个项目中多次使用 public interface Process
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • Netty:阻止调用以获取连接的服务器通道?

    呼吁ServerBootstrap bind 返回一个Channel但这不是在Connected状态 因此不能用于写入客户端 Netty 文档中的所有示例都显示写入Channel从它的ChannelHandler的事件如channelCon
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • pageHelper分页失效解决方案

    前言 pageHelper是一款优秀的Mybatis分页插件 在项目中可以非常便利的使用 使开发效率得到很大的提升 但不支持一对多结果映射的分页查询 所以在平时的使用时 对于一对多分页会出现分页错误 这篇文章主要对pageHelper分页错
  • activiti学习之服务任务

    写在前面 对于工作流 我们使用最多的是用户任务节点 用户任务节点就是给用户来生成任务的 需要人来手动的处理 而与之对应的还有服务任务节点 这种类型的节点需要人手动的参与而是程序来执行 即执行某个类的某个方法 这个类一般是org activi
  • Java 实现 MD5 加密算法

    1 MD5 加密算法 1 1 MD5 算法介绍 MD5 消息摘要算法 英文 MD5 Message Digest Algorithm 一种被广泛使用的密码散列函数 可以产生出一个128位 16字节 的散列值 hash value 用于确保信
  • 子图匹配算法——VF2算法讲解

    讲的很通透了 https zhuanlan zhihu com p 259393192
  • CSS五款超好用的布局网站

    CSS Grid Generator https cssgrid generator netlify app CSS Layout https csslayout io Flexbox Generator https loading io
  • vtkdicom0.8_vtk9.2_dcmtk3.6.7_qt6.2编译OK

    目录 0 结果展示 1 cmake要点 2 编译报错解决 3 参考链接 0 结果展示
  • 吃透Chisel语言.23.Chisel时序电路(三)——Chisel移位寄存器(Shift Register)详解

    Chisel时序电路 三 Chisel移位寄存器 Shift Register 详解 上一篇文章介绍了Chisel计数器以及一些高级用法 内容很多 学下来肯定收获也会很多 除了计数器以外 还有一种寄存器的应用十分广泛 那就是移位寄存器 这一
  • Linux Test Project(一)

    http www vimlinux com lipeng 2014 09 12 ltp Testing Linux one syscall at a time LTP是从SGI开始的 后由IBM 思科 富士通 SUSE Redhat等组织开
  • Java多线程下 ThreadLocal 的应用实例

    ThreadLocal很容易让人望文生义 想当然地认为是一个 本地线程 其实 ThreadLocal并不是一个 Thread 而是 Thread 的局部变量 也许把它命名为 ThreadLocalVariable更容易让人理解一些 当使用
  • jQuery Ajax 初始化方法

    ajaxSetup headers Authorization auth token cache false 禁用缓存 dataType json contentType application json contentType appli
  • 《深入理解java虚拟机》笔记

    深入理解java虚拟机 走进java java不仅仅是一门编程语言 还是一个由一系列计算机软件和规范形成的技术体系 她有以下优点 结构严谨 面向对象 摆脱硬件平台的限制 实现了一次编写 到处运行 提供了一个相对安全的内存管理和访问机制 有一
  • 面向文本和视觉线索联合推断的多模态上下文推理方法

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 报告题目 面向文本和视觉线索联合推断的多模态上下文推理方法 内容简介 联合文本和视觉线索条件推理任务是一项复杂多模态推理任务 其中 文本线索提供与视觉内容互补的先验假设或者外部知
  • 学习笔记-创建赫夫曼树

    赫夫曼树 给定 n 个权值作为 n 个叶子结点 构造一棵二叉树 若该树的带权路径长度 wpl 达到最小 称这样的二叉树为最优二叉树 也称为哈夫曼树 Huffman Tree 还有的书翻译为霍夫曼树 赫夫曼树是带权路径长度最短的树 权值较大的
  • 学会项目成本管理计算,PMP计算题就是送分题

    学会项目成本管理计算 PMP计算题就是送分题 PMP中的计算主要在 lt 项目成本管理 gt 的控制成本部分 服务于挣值管理 EVM Earned Value Management 挣值分析 EVA Earned Value Analysi
  • 【知识图谱】基本概念&数据&综合应用&具体使用

    知识图谱 基本概念 数据 综合应用 具体使用 1 基本概念 1 1知识图谱组成 1 2 应用 1 2 1 应用一 医疗领域方向检索 1 2 2 应用二 金融领域反欺诈 金融知识图谱 1 2 3 推荐系统 2 数据 2 1 文本数据 2 2
  • vtk.js+react 实现ArrowSource 平移,缩放,旋转

    vtk js react 实现ArrowSource 平移 缩放 旋转 MatrixBuilder 矩阵构造器 ArrowSource 箭头 实现代码 MatrixBuilder 矩阵构造器 实现方法主要使用到的APIMatrixBuild
  • 扩散模型实战(三):扩散模型的应用

    推荐阅读列表 扩散模型实战 一 基本原理介绍 扩散模型实战 二 扩散模型的发展 扩散只是一种思想 扩散模型也并非固定的深度网络结构 除此之外 如果将扩散的思想融入其他领域 扩散模型同样可以发挥重要作用 在实际应用中 扩散模型最常见 最成熟的
  • 云存储服务器的安装文件,云存储服务器的安装文件

    云存储服务器的安装文件 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ
  • 【三维重建】Ubuntu18.04安装COLMAP

    Ubuntu18 04安装COLMAP 文章目录 Ubuntu18 04安装COLMAP 前言 安装COLMAP 安装CUDA cuDNN 安装依赖项 安装Ceres优化库 安装glog 可选 配置并编译COLMAP 运行COLMAP 总结
  • 数据结构-线性表之堆栈

    什么是栈 是一种数据结构 能够实现后进先出的一种业务场景 即栈中的元素被处理时 按后进先出的顺序进行 所以栈又叫做后进先出表 LIFO 例子 生活中的叠放在厨房桌子上的碗就是一种栈结构 放的时候只能把碗放在最上面 取的时候只能从最上面开始取