【数据结构】栈的模拟和使用理解

news2025/7/12 9:38:07

学习目录

  • 栈(Stack)
      • 栈的概念
      • 栈的使用
      • 栈相关的应用场景
      • 栈的模拟实现
      • 中缀表达式 转 后缀表达式

栈(Stack)

栈的概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作.
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,遵守先进后出,后进先出的原则

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据在栈顶
在这里插入图片描述
在集合框架中,Stack的继承实现关系如下:
在这里插入图片描述从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表
不同的是Vector类,是线程安全的动态数组,但是性能较差 , 现在已经不是很常用了 , 可以说已经过时了

栈的使用

方法解释
Stack()构造一个空的栈
E push(E e)将e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()检测栈是否为空
public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();//创建一个栈
        stack.push(1);//添加一个元素到栈中
        stack.push(2);
        stack.push(3);
        stack.push(4);
        System.out.println("当前元素有:"+ stack.size());
        System.out.println(stack);

        int x = stack.pop();//取出栈顶的元素返回
        System.out.println(x);
        System.out.println("当前元素有:"+ stack.size());

        int n = stack.peek();//获取当前栈顶的元素
        System.out.println(n);

        if(stack.empty()){
            System.out.println("空栈!");
        }else{
            System.out.println("当前栈空间为:"+stack.size());
        }
    }

栈相关的应用场景

  1. . 改变元素的序列

若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
A: 1、4、3、2
B: 2、3、4、1
C: 3、1、4、2
D: 3、4、2、1

图解:
在这里插入图片描述

一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺序是( )。
A:1、2、3、4、5、A、B、C、D、E
B: E、D、C、B、A、5、4、3、2、1
C: A、B、C、D、E、1、2、3、4、5
D: 5、4、3、2、1、E、D、C、B、A

图解:
在这里插入图片描述

栈的模拟实现

public class MyStack {
    public int[] elen;
    public int usedsize;

    public MyStack() {
        this.elen = new int[10];
    }

    //压栈
    public int push(int val){
        if(isFull()){
            // 扩容
            elen = Arrays.copyOf(elen,2*elen.length);
        }
        this.elen[usedsize] = val;
        usedsize++;
        return val;
    }
    // 判断数组的空间是否满了
    public boolean isFull(){
        return usedsize == elen.length;
    }
    
    // 弹出
    public int pop(){
        if(empty()){
            throw new MyEmptyStackException("栈为空!");
        }
        int n = elen[usedsize-1];
        usedsize--;
        return n;

        // 第二种方法  这种方法和上面比较简洁一点
        // return elen[--usedsize];
    }
    // 判断数组是否为空
    public boolean empty(){
        return usedsize == 0;
    }

   // 获取栈顶元素
    public int peet(){
        if(empty()){
            throw new MyEmptyStackException("栈为空!");
        }
        return elen[usedsize-1];
    }
}

中缀表达式 转 后缀表达式

  • 基本概念
    中缀表达式
    操作符以中缀形式位于运算数中间,日常通用的算术和逻辑公式表示方法,(例如:1+2 、 3*4)
    后缀表达式
    又称逆波兰式,操作符以后缀形式位于两个运算数后,(例如:1+2 在转换成后缀表达形式就是1 2 +)
    前缀表达式:
    又称波兰式,操作符以前缀形式位于两个运算数前(如:3+2的前缀表达形式就是+ 3 2)

例如:
在这里插入图片描述
中缀转后缀表达式通常是应用在计算器上
👀👀👀
例如:

力扣链接: 逆波兰表达式求值

将后缀表达式:1 2 3 * + 4 5 * 6 + 7 * + 进行计算,求结果?
在这里插入图片描述

public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        //1.遍利 tokens 数组,判断当中的字符串的类型
        for(String x : tokens){
            //如果不是运算符的情况下
            if(!isOperations(x)){
                // Integer.parseInt() 是把字符串转换成整数
                stack.push(Integer.parseInt(x));// 压栈

            }else{
                int n2 = stack.pop();
                int n1 = stack.pop();
                switch(x) {
                    case "+":
                        stack.push(n1+n2);
                        break;
                     case "-":
                        stack.push(n1-n2);
                       break;
                    case "*":
                        stack.push(n1*n2);
                        break;
                    case "/":
                        stack.push(n1/n2);
                        break;
                }
            }
        }
        return stack.pop();
   }
    // 判断是否是运算符
    public boolean isOperations(String s){
        if(s.equals("+") ||s.equals("-") ||s.equals("*") ||s.equals("/") ){
            return true;
        }
        return false;
    }
  • 有效的括号
    力扣链接: 有效的括号

在这里插入图片描述

public boolean isValid(String s) {
        // 创建栈
        Stack<Character> stack = new Stack<>();
        // 遍历
        for(int i = 0;i<s.length();i++){
            // 获取元素赋值给  ch
            char ch = s.charAt(i);
            // 1.判断是否是 左括号
            if(ch == '(' || ch == '[' || ch == '{'){
                stack.push(ch);// 压栈
            }else{
                // 2.遇到了右括号,但是栈为空,不匹配
                if(stack.empty()){//判断栈是否为空
                    return false;
                }
                // 获取
                char ch2 = stack.peek();
                // 3.如果满足下面任何的条件逻辑,都是匹配的
                if(ch2 == '(' && ch == ')' || ch2 == '{' && ch == '}'|| ch2 == '[' && ch == ']'){
                      stack.pop();
                }else{
                    return false;
                }
            }
        }
        // 4. 遍历完成后,如果最后栈不为空,说明左括号还在栈中没有匹配
        if(!stack.empty()){
            return false;
        }
        return true;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于vba代码运行时错误1004 应用程序定义或对象定义错误问题

一、错误描述 将Excel所有工作表&#xff0c;汇总到一个工作表中&#xff1a; 在thisworkbook中运行如下&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Su…

大数据面试题(五):Hadoop优化核心高频面试题

文章目录 Hadoop优化核心高频面试题 一、Mapreduce 跑的慢的原因&#xff1f; 1、计算机性能 2、I/O 操作优化 二、Mapreduce优化方法 1、数据输入 2、map阶段 3、reduce阶段 4、IO传输 5、数据倾斜问题 6、常用的调优参数 三、HDFS小文件优化方法 1、HDFS小文件…

【MATLAB】常见语法结构和实用操作

目录 语法结构 循环&#xff08;遍历&#xff09;结构 函数结构 画图操作 绘制函数图像 ezplot figure多图绘制 创建多项式 按照系数创建多项式 利用多项式零点创建多项式 解方程组 语法结构 循环&#xff08;遍历&#xff09;结构 与其它编程语言类似&#xff0c;…

常用辅助类

CountDownLatch 应用场景&#xff1a;1.多线程任务汇总。2.多线程任务阻塞住&#xff0c;等待发令枪响&#xff0c;一起执行。 减法计数器 每次有线程调用&#xff0c;数量-1&#xff0c;当计数器归零&#xff0c;countDownLatch.await()就会被唤醒向下执行。 import java.uti…

【代码随想录】二刷-二叉树

二叉树 《代码随想录》 二叉树的遍历方式 深度优先遍历: 前序遍历(递归法、迭代法): 中左右中序遍历(递归法、迭代法): 左中右后序遍历(递归法、迭代法): 左右中 广度优先遍历: 层序遍历(迭代法) 二叉树的定义 struct TreeNode{int val;TreeNode* left;TreeNode* right;TreeN…

无线传感器网络:网络层

文章目录Challenges for RoutingEnergy EfficiencyScalabilityAddressingRobustnessTopologyApplicationRouting MetricsQuality-of-Service (QoS)Minimum HopEnergyMinimum energy consumed per packetMaximum time to network partitionMaximum average energy capacityMaxim…

Java并发-操作系统,进程,线程,并行并发?

我们首先来看看&#xff0c;三者之间的关系&#xff0c;从图中可以看到 操作系统是包含多个进程的容器&#xff1b;而每个进程又是容纳多个线程的容器。什么是进程&#xff1f;官方定义&#xff1a; 进程&#xff08;baiProcess&#xff09;是计算机中的程序关于某数据集合上的…

详解:网络虚拟化卸载加速技术的演进

在传统的应用场景中&#xff0c;服务器资源过剩情况普遍&#xff0c;为了充分利用服务器资源&#xff0c;产生了虚拟化技术。虚拟化技术以牺牲部分效率为代价提升了资源的使用率&#xff0c;将原来需要硬件完成的工作&#xff0c;通过软件模拟的方式&#xff0c;满足多个云租户…

初识Qt Quick

讲讲最近几年Qt的热门技术Quick这一块了。 啥是Qt&#xff1f; 哦&#xff0c;这是一个宣称可以跨任意平台&#xff0c;开发各种场景应用软件的开发框架。从三个维度来讲&#xff0c;就是开发库framework&#xff0c;集成开发平台IDE&#xff0c;以及成熟的开发思维模式。 Q…

CAS:82055-94-5,Azide-PEG-Azide,N3-PEG-N3,叠氮聚乙二醇叠氮试剂供应

1、名称 英文&#xff1a;Azide-PEG-Azide&#xff0c;N3-PEG-N3 中文&#xff1a;叠氮-聚乙二醇-叠氮 2、CAS编号&#xff1a;82055-94-5 3、所属分类&#xff1a;Azide PEG 4、分子量&#xff1a;可定制&#xff0c;叠氮-PEG-叠氮 2000、叠氮peg叠氮 1000、叠氮-聚乙二醇…

org.activiti.bpmn

org.activiti.bpmn目录概述需求&#xff1a;设计思路实现思路分析1.BpmnAutoLayout2.BPMNLayout参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for ch…

Mybatis概述

1 概述 原来是Apache的一个开源项目&#xff0c;叫iBatis, 2010年6月这个项目由 Apache Software Foundation 迁移到了 Google Code&#xff0c;随着开发团队转投Google Code 旗下&#xff0c;从 iBatis3.0正式更名为MyBatis。 MyBatis 是一款优秀的持久层框架&#xff0c;对j…

容器卷挂载的秘密

什么是容器卷 数据卷 &#xff08;Data Volumes &#xff09;是一个可供容器使用的特殊目录&#xff0c;它将主机操作系统目录直接映射进容器&#xff0c;类似于 Linux 中的 mount 行为。 容器挂载原理 containerd创建的容器里的数据存储在下面的目录中 [rootmaster01 httpb…

【C/C++】万字图文详解C语言文件操作 完美装饰课设大作业

目标导航 写在前面 为什么使用文件&#xff1f; 什么是文件&#xff1f; 程序文件 数据文件 认识文件名 文件的打开和关闭 文件指针 文件的打开和关闭 1.以"r"&#xff08;只读&#xff09;的方式打开文件 2.以"w"&#xff08;只写&#xff09;…

Java#24(常见API--2)

目录 一.Rantime Runtime表示当前虚拟机的运行环境 Runtime常用方法 扩展:对象克隆 二.Objects Objects是一个对象工具类,提供了一些操作对象的方法 一.Rantime Runtime表示当前虚拟机的运行环境 Runtime常用方法 方法名 作用 publi…

葡萄糖-聚乙二醇-链霉亲和素|Streptavidins-PEG-Glucose|链霉亲和素-PEG-葡萄糖

链霉亲和素(streptavidin下称SA)是与亲和素(avidin下称AV)是一种蛋白质&#xff0c;链霉亲和素是四聚体蛋白&#xff0c;大小为66KDa。一分子链霉亲和素可以高度特异性地与四分子生物素结合&#xff0c;两者之间的亲和力较为强烈。链霉亲和素分子由4条相同的肽链组成&#xff0…

delete-by-query和复合查询

根据term&#xff0c;match等查询方式去删除大量的文档 Ps&#xff1a;如果你需要删除的内容&#xff0c;是index下的大部分数据&#xff0c;推荐创建一个全新的index&#xff0c;将保留的文档内容&#xff0c;添加到全新的索引 # delete-by-query POST /sms-logs-index/sms-lo…

毕业设计-基于机器视觉的颜色目标识别

目录 前言 课题背景和意义 实现技术思路 什么是彩色空间 怎么利用彩色空间 颜色识别的过程 读取图片进行hsv色域转换 对图片特定颜色识别 本地摄像头对视频流进行颜色识别 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后…

Python基础-面向对象编程之特性(property)

Python面向对象编程之特性(property) 一、统一访问原则 通常&#xff0c;我们访问实例或类的属性时&#xff0c;将返回所存储的相关值。而特性&#xff08;property&#xff09;是一种特殊的属性&#xff0c;访问它时会计算它的值。 请看下面的例子&#xff1a; import mat…

基于android的个性闹铃的设计与开发(闹铃,日历,计时器,备忘录)

目 录 摘 要 2 Abstract 2 1 选题的背景和意义 5 1.1 选题的背景 5 1.2 国内外研究现状 5 1.2.1 国内外手机系统现状 5 1.2.2 国内外手机应用现状 7 1.2.3 发展趋势 7 2 需求分析 9 2.1 系统需求 9 2.2 需求分析 9 2.3 约束与限制 10 3 总体设计 11 3.1 系统结构图 11 3.2 总体…