超神之路 数据结构 3 —— Stack栈实现及应用

news2024/10/7 16:27:42

        栈也是一种线性表结构,相较于数组,栈对应的操作是数组的子集,我们只要实现从一端添加元素,并从这个一端取出元素,这一端我们称呼它为栈顶,正是由于这种结构,它具有“后入先出”(LIFO : Last In First Out )的特性。利用这种特性,可以为我们解决掉计算机世界中的很多应用场景遇到的特殊问题,比如:

  •         编辑器集成的Undo撤销操作,我们可以在每次编辑文本的时候,记录一个快照到栈中,当你需要unDo操作时,出栈即可。
  •         另一种常用的场景就是程序调用系统栈执行子函数调用的例子。比如Go语言的函数调用的时候,goroutine 会创建一个轻量的线程,在一个栈中创建栈帧,当我们遇到在main方法体中调用子方法时,就会终止当前活动栈帧(active frame),并记录当前代码的执行位置,压入另一个栈帧作为活动栈帧 ,当活动栈帧运行完方法后,就会出栈,回到上次外面的函数调用位置。举例说明  ↓

        func A(){

             B() // 第66行,记作B66

        }

        func B(){

             C()  //第88行,记作C88

        }

        A66 压入栈 --> B88压入栈 ->C执行完了,计算机蒙圈了 -->然后查看栈顶元素B88 -->找到人生目标了,又继续执行B88 ,等B88执行完出栈 --->计算机蒙圈了,就要查看系统栈,发现栈顶元素是A66时 --> 继续执行A66  执行完了,又蒙圈了 -->就来查看栈顶元素,发现栈中没有元素了。至此就全部执行完了。

        利用前面的动态数组,实现属于自己的一个栈。同样看一下JDK的栈定义,我们的实现尽量向JDK的定义的栈的语言意义上靠近。参考后,代码如下:

package com.company.array;

public interface Stack<E> {

    E push(E item);

    E pop();

    E peek();

    boolean empty();

    int search(Object o);

}

    int search(Object o); 查找这个元素和栈顶的距离,这个貌似用不上,我们就先返回0。

        根据要求设计出属于我们自己的栈:

package com.company.array;

public class MyStack<E> implements Stack<E>{

    private DynamicArray<E> dynamicArray = new DynamicArray<>();

    @Override
    public E push(E item) {
        dynamicArray.addLast(item);
        return item;
    }

    @Override
    public E pop() {
        E remove = dynamicArray.remove(dynamicArray.getSize() - 1);
        return remove;
    }

    @Override
    public E peek() {
        return dynamicArray.get(dynamicArray.getSize() - 1);
    }

    @Override
    public boolean empty() {
        return dynamicArray.getSize() == 0 ;
    }

    @Override
    public int search(Object o) {
        return 0;
    }

    
}

        解决Leedcode 上的一个问题:

         代码参考:

package com.company.array.queue;


public class CharacterIsValid {
        // () or  [] {} () 匹配 。leedcode
    public static boolean isValid(String s){

        MyStack<Character> stack = new MyStack<>();

        for(int i = 0 ;i<s.length();i++){
            char c = s.charAt(i);

            if(c == '(' || c== '[' || c== '{' ){
                stack.push(c);
            }else {
                    Character pop = stack.pop();
                if(c==')' && pop !='('){
                    return false;
                }
                if(c=='}' && pop !='{'){
                    return false;
                }
                if(c==']' && pop !='['){
                    return false;
                }

            }
        }

        //只有栈里的,全部匹配完毕,才能算真的符合情况。有元素,没得匹配,pop不出去的情况,也算无效。
        return  stack.empty();
    }


    public static void main(String[] args) {
        String s = "({}[])";
        boolean valid = isValid(s);
        System.out.println(valid);

    }
}

        栈在计算机中是一个很重要的线性表,可以利用数组实现也可以利用链表实现,下面我们将开启新的一篇来介绍一下链表的相关知识和具体实现。

        下一篇见,加油!

        

                

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

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

相关文章

PTA题目 计算工资

某公司员工的工资计算方法如下&#xff1a;一周内工作时间不超过40小时&#xff0c;按正常工作时间计酬&#xff1b;超出40小时的工作时间部分&#xff0c;按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工&#xff0c;进公司不少于5年的员工为老职工&#…

基于jsp+mysql+ssm健身信息交流网站-计算机毕业设计

项目介绍 随着全民健身运动的兴起&#xff0c;越来越多的人走进了健身房&#xff0c;而传统的管理模式已不能适应现代健身机构的发展趋势&#xff0c;如何增强健身房会员卡的管理和完善客户服务&#xff0c;成了健身房发展的当务之急。健身信息管理系统的研究与开发&#xff0…

文本摘要实战:基于句子相似度矩阵构建图结构实现文本摘要 代码+数据

任务描述: 自动文本摘要(Text Summarization)是指给出一段文本,我们从中提取出要点,然后再形成一个短的概括性的文本。自动的文本摘要是非常具有挑战性的,当我们作为人类总结一篇文章时,我们通常会完整地阅读它以发展我们的理解,然后写一个摘要突出其要点。由于计算机缺乏…

计算机毕业设计springboot+vue基本微信小程序的码高教育课后在线小程序

项目介绍 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,码高教育课后在线小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行码高教育课后在线小程序的设计与开…

HTML期末大学生网页设计作业----锤子手机 1页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&a…

java计算机毕业设计ssm基于JAVA的网上购物系统-商城购物网站

项目介绍 本网上购物网站是针对目前商城的实际需求,从实际工作出发,对过去的网上购物存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、模型、原理…

【机器学习】红酒数据集和加利福尼亚的房价数据的随机森林算法详解

一.随机森林 1.1随机森林的构建 bootstrap参数代表的是bootstrap sample&#xff0c;也就是“有放回抽样”的意思&#xff0c;指每次从样本空间中可以重复抽取同一个样本&#xff08;因为样本在第一次被抽取之后又被放回去了&#xff09; 假设&#xff0c;原始样本是”苹果&…

【POJ No. 3253】 围栏修复 Fence Repair

【POJ No. 3253】 围栏修复 Fence Repair 北大OJ 题目地址 这道题其实我们 之前就做过了 https://blog.csdn.net/weixin_44226181/article/details/127064923 当时我们 是在学习哈夫曼树 【题意】 约翰想修牧场周围的篱笆&#xff0c;需要N 块&#xff08;1≤N ≤20000&…

CMake中if的使用

CMake中的if命令用于有条件地执行一组命令&#xff0c;其格式如下&#xff1a; if(<condition>)<commands> elseif(<condition>) # optional block, can be repeated<commands> else() # optional block<commands> endif() 根据Co…

HTML5期末大作业:旅游网页设计与实现——旅游风景区网站HTML+CSS (1)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&…

【项目实战:核酸检测平台】第一章 逆向工程

引言 准备做个项目实战系列&#xff0c;选一些比较有代表性&#xff0c;难度适中、规模合适的项目&#xff0c;从不同的角度&#xff0c;不同的深度去解析。很多初学者都抱怨没有实战项目&#xff0c;而学校/机构里大量用烂的学生管理、图书管理、电子商城等项目实在没有什么新…

LeetCode--230. 二叉搜索树中第K小的元素(C++描述)

// Source :https://leetcode.cn/problems/kth-smallest-element-in-a-bst/ // Date : 2022-11-19 /************************************************************************************** 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计…

Nginx 快速入门

一、简述 1.1 介绍 传统的 Web 服务器&#xff0c;每个客户端连接作为一个单独的进程或线程处理&#xff0c;需在切换任务时将 CPU 切换到新的任务并创建一个新的运行时上下文&#xff0c;消耗额外的内存和 CPU 时间&#xff0c;当并发请求增加时&#xff0c;服务器响应变慢&…

修改xml文件

一、前言 本节是修改xml;同样方法也可修改arxml文件&#xff1b;主要使用LET.Element创建节点&#xff1b; 二、知识点 1、专门用于格式化处理xml文件使其具有层级分明的缩进函数 #专门用于格式化处理xml文件使其具有层级分明的缩进 def indent( elem, level0): i "\n&…

基于51单片机的全自动智能洗衣机控制系统Proteus仿真

资料编号&#xff1a;108 下面是相关功能视频演示&#xff1a; 108-基于51单片机的全自动智能洗衣机控制系统Proteus仿真&#xff08;仿真源码全套资料&#xff09;设计功能&#xff1a; 1、对水温实时显示 2、显示滚筒转速 3、显示运行倒计时 4、能通过按钮分别设置洗涤时间…

一文带你深入理解【Java基础】· 常用类(上)字符串相关类

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

[附源码]java毕业设计社区私家车位共享收费系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于51单片机的八路电压表采集Proteus仿真

资料编号&#xff1a;110 下面是相关功能视频演示&#xff1a; 110-基于51单片机的八路电压表采集Proteus仿真&#xff08;源码仿真原理图全套资料&#xff09;功能如下&#xff1a; 利用单片机及其外围器件&#xff08;A/D转换器等&#xff09;实现一款简易电压表&#xff0…

(免费分享)基于springboot医药进销存系统

源码获取&#xff1a;关注文末gongzhonghao&#xff0c;输入014领取下载链接 开发工具&#xff1a;IDEA,数据库mysql 技术&#xff1a;springbootmybatis 系统主要分两个角色&#xff0c;客户和员工 package cn.tedu.drug.controller;import java.io…

【Pytorch with fastai】第 18 章 :使用 CAM 进行 CNN 解释

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…