【Java数据结构】---List(Stack)

news2025/1/23 12:59:55

乐观学习,乐观生活,才能不断前进啊!!!

我的主页:optimistic_chen

我的专栏:c语言 ,Java

欢迎大家访问~
创作不易,大佬们点赞鼓励下吧~

文章目录

  • 前言
  • 栈Stack
  • 栈的模拟实现
  • 栈的练习
  • 完结

前言

在这里插入图片描述
截至目前在集合框架中,我们学完了List接口下的ArrayList和LinkedList,今天要学的是栈(Stack),数据结构中最让人“开心”的部分,期待一下吧~ ~ ~

栈Stack

栈:一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。

栈顶 :进行数据插入和删除操作的一端,另一端称为栈底。栈中的数据元素遵守后进先出的原则

在这里插入图片描述

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据在栈顶

栈的模拟实现

根据Stack的源码,它只有简单的几个方法,并不像之前ArrayList、LinkedList那么多的方法。因此,我们学起来一定会轻松很多。
在这里插入图片描述
首先,实现整个栈,我们要清楚,这个栈要拿数组表示或者链表表示

其实两者都行,只是对于我们初学者来说,数组更好接受,也更容易接收。把栈中的元素以下标的形式体现出来,是不是更好理解了呢?

压栈操作

public void push(int val){
        if(isFull()){
            this.array= Arrays.copyOf(array,2*array.length);
        }
        array[usedSize++]=val;
    }
    public boolean isFull(){
        return usedSize==array.length;
    }

出栈操作

public int pop(){
        if(isEmpty()){
            throw new EmptyStackExpection();
        }
        int val=array[usedSize-1];
        usedSize--;
        return val;
    }
public boolean isEmpty(){
        if(usedSize==0){
            return true;
        }
        return false;
    }

获取栈顶元素

public int peek(){
        if(isEmpty()){
            throw new EmptyStackExpection();
        }
        return array[usedSize-1];
    }

测试代码:

public static void main(String[] args) {
        MyStack stack=new MyStack();
        stack.push(10);
        stack.push(11);
        stack.push(12);
        stack.push(13);
        stack.push(14);

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

在这里插入图片描述
使用数组来模拟的栈叫做顺序栈它的入栈、出栈的时间复杂度都是O(1);
那么用链表来模拟的栈称链式栈单链表的可以采用头插法入栈或者尾插法入栈
在这里插入图片描述

在这里插入图片描述
既然单链表可以,那么双向链表当然也是OK的,并且,入栈时,不管是头插法还是尾插法,时间复杂度可以达到O(1)

public static void main(String[] args) {
        LinkedList<Integer> stack=new LinkedList<>();
        stack.push(10);
        stack.push(11);
        stack.push(12);
        stack.push(13);
        stack.push(14);

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

    }

所以,LinkedList不仅是链表也可以当做栈来使用。

从下图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的,这个以后再说。

在这里插入图片描述

栈的练习

有效的括号 - - -力扣

public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i=0;i<s.length();i++){
            char ch=s.charAt(i);
            if(ch=='('||ch=='['||ch=='{'){
                stack.push(ch);
            }else{
                if(stack.isEmpty()){
                    return false; 
                }
                //此时开始判断是否匹配
                char ch2=stack.peek();
                if(ch==')'&&ch2=='('||ch==']'&&ch2=='['||ch=='}'&&ch2=='{'){
                    stack.pop();
                }else{
                    return false;
                }
            }
        }
        if(!stack.isEmpty()){
            return false;
        }
        return true;
    }

逆波兰表达式求值

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for(String str : tokens){
            if(!isOperator(str)){
                int x=Integer.parseInt(str);
                stack.push(x);
            }else{
                int val2=stack.pop();
                int val1=stack.pop();
                switch(str){
                    case "+":
                    stack.push(val1+val2);
                    break;
                    case "-":
                    stack.push(val1-val2);
                    break;
                    case "*":
                    stack.push(val1*val2);
                    break;
                    case "/":
                    stack.push(val1/val2);
                    break;
                }
            }
            
        }
        return stack.pop();

    }
    private boolean isOperator(String ch){
        if(ch.equals("+")||ch.equals("-")||ch.equals("*")||ch.equals("/")){
            return true;
        }
        return false;
    }
}

完结

好了,到这里Java语法部分就已经结束了~
如果这个系列博客对你有帮助的话,可以点一个免费的赞并收藏起来哟~
可以点点关注,避免找不到我~ ,我的主页:optimistic_chen
我们下期不见不散~~Java

下期预告: **【Java数据结构】- - -Queue **

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

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

相关文章

PyTorch 基础学习(5)- 神经网络

系列文章&#xff1a; PyTorch 基础学习&#xff08;1&#xff09; - 快速入门 PyTorch 基础学习&#xff08;2&#xff09;- 张量 Tensors PyTorch 基础学习&#xff08;3&#xff09; - 张量的数学操作 PyTorch 基础学习&#xff08;4&#xff09;- 张量的类型 PyTorch 基础学…

<数据集>路面坑洼识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;681张 标注数量(xml文件个数)&#xff1a;681 标注数量(txt文件个数)&#xff1a;681 标注类别数&#xff1a;1 标注类别名称&#xff1a;[pothole] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;对类…

15.3 模型评估与调优

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

给SQL server数据库表字段添加注释SQL,附修改、删除注释SQL及演示

目录 一. 前提小知识(数据库连接&#xff0c;数据库&#xff0c;SCHEMA&#xff0c;Table的关系) 二. 添加备注 2.1 添加备注基本语法(sys.sp_addextendedproperty) 2.2 SQL演示 2.3 fn_listextendedproperty函数查询备注个数 2.4 开发常用添加注释语法 三. 修改备注 3…

深入理解 PHP 高性能框架 Workerman 守护进程原理

大家好&#xff0c;我是码农先森。 守护进程顾名思义就是能够在后台一直运行的进程&#xff0c;不会霸占用户的会话终端&#xff0c;脱离了终端的控制。相信朋友们对这东西都不陌生了吧&#xff1f;如果连这个概念都还不能理解的话&#xff0c;建议回炉重造多看看 Linux 进程管…

C++:vector类(default关键字,迭代器失效)

目录 前言 成员变量结构 iterator定义 size capacity empty clear swap []运算符重载 push_back pop_back reserve resize 构造函数 默认构造函数 default 迭代器构造 拷贝构造函数 赋值重载函数 析构函数 insert erase 迭代器失效问题 insert失效 er…

Linux使用学习笔记3 系统运维监控基础

系统运维监控类命令 查询每个进程的线程数 for pid in $(ps -ef | grep -v grep|grep "systemd" |awk {print $2});do echo ${pid} > /tmp/a.txt;cat /proc/${pid}/status|grep Threads > /tmp/b.txt;paste /tmp/a.txt /tmp/b.txt;done|sort -k3 -rn for pid…

mfc100u.dll丢失问题分析,详细讲解mfc100u.dll丢失解决方法

面对mfc100u.dll文件丢失带来的挑战时&#xff0c;许多用户都可能感到有些无助&#xff0c;尤其是当这一问题影响到他们日常使用的软件时。但实际上&#xff0c;存在几种有效方法可以帮助您快速恢复该关键的系统文件。为了方便不同水平的用户&#xff0c;本文将详细解析各种处理…

自动化测试工具Selenium IDE

简介 Selenium IDE 是实现Web自动化的一种便捷工具&#xff0c;本质上它是一种浏览器插件。该插件支持Chrome和Firefox浏览器&#xff0c;拥有录制、编写及回放操作等功能&#xff0c;能够快速实现Web的自动化测试。 使用场景 1、Selenium IDE本身的定位并不是用于复杂的自动…

Ps:首选项 - 技术预览

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“技术预览” Technology Previews选项卡允许用户启用或禁用一些实验性功能&#xff0c;以测试或使用 Adobe 提供的最新技术。 技术预览 Technology Previews 启用保留细节 2.0…

如何解决浏览器页面过曝,泛白等问题

问题描述&#xff0c;分别对应edge和chrome浏览器这是什么原因&#xff1f;

使用C#禁止Windows系统插入U盘(除鼠标键盘以外的USB设备)

试用网上成品的禁用U盘的相关软件&#xff0c;发现使用固态硬盘改装的U盘以及手机等设备&#xff0c;无法被禁止&#xff0c;无奈下&#xff0c;自己使用C#手搓了一个。 基本逻辑&#xff1a; 开机自启&#xff1b;启动时&#xff0c;修改注册表&#xff0c;禁止系统插入USB存…

字符串函数!!!(续)(C语言)

一. strtok函数的使用 继续上次的学习&#xff0c;今天我们来认识一个新的函数strtok&#xff0c;它的原型是char* strtok(char* str,const char* sep)&#xff0c;sep参数指向了一个字符串&#xff0c;定义了用作分隔符的字符合集&#xff0c;第一个参数指定⼀个字符串&#…

DataStream API的Joining操作

目录 Window Join Tumbling Window Join Sliding Window Join Session Window Join Interval Join Window CoGroup Window Join 窗口连接&#xff08;window join&#xff09;将两个流的元素连接在一起&#xff0c;这两个流共享一个公共键&#xff0c;并且位于同一窗口。…

从老旧到智慧病房,全视通智慧病房方案减轻医护工作负担

传统的老旧病房面临着诸多挑战。例如&#xff0c;患者风险信息的管理仍依赖于手写记录和人工核查&#xff1b;病房呼叫系统仅支持基本的点对点呼叫&#xff0c;缺乏与其它系统的集成能力&#xff1b;信息传递主要依靠医护人员口头传达&#xff1b;护理信息管理分散且不连贯&…

JavaEE-多线程

前情提要&#xff1a;本文内容过多&#xff0c;建议搭配目录食用&#xff0c;想看哪里点哪里~ PC端目录 手机端目录 话不多说&#xff0c;我们正式开始~~ 目录 多线程的概念进程和线程的区别和联系:使用Java代码进行多线程编程Thread类中的方法和属性线程的核心操作1. 启动…

【mamba学习】(一)SSM原理与说明

mamba输入输出实现与transformer几乎完全一样的功能&#xff0c;但速度和内存占用具有很大优势。对比transformer&#xff0c;transformer存在记忆有限的情况&#xff0c;如果输入或者预测的序列过长可能导致爆炸&#xff08;非线性&#xff09;&#xff0c;而mamba不存在这种情…

物理网卡MAC修改器v3.0-直接修改网卡内部硬件MAC地址,重装系统不变!

直接在操作系统里就能修改网卡硬件mac地址&#xff0c;刷新网卡mac序列号硬件码机器码&#xff0c;电脑主板集成网卡&#xff0c;pcie网卡&#xff0c;usb有线网卡&#xff0c;usb无线网卡&#xff0c;英特尔网卡&#xff0c;瑞昱网卡全支持&#xff01; 一键修改mac&#xff0…

百问网全志系列开发板音频ALSA配置步骤详解

8 ALSA 8.1 音频相关概念 ​ 音频信号是一种连续变化的模拟信号&#xff0c;但计算机只能处理和记录二进制的数字信号&#xff0c;由自然音源得到的音频信号必须经过一定的变换&#xff0c;成为数字音频信号之后&#xff0c;才能送到计算机中作进一步的处理。 ​ 数字音频系…

MySQL本地Windows安装

下载MySQL 官网&#xff1a;MySQL 下载完成后文件 安装类型 选择功能 功能过滤筛选&#xff0c;系统为64位操作系统&#xff0c;所以选【64-bit】&#xff0c;32位可选【32.bit】 下方勾选后自动检查安装环境&#xff0c;如果提示缺少运行库&#xff0c;请先安装VC_redist.x64。…