web前端算法简介之栈

    • 栈的基本操作包括:
      • 初始化栈(InitStack)
      • 判断栈是否为空(IsStackEmpty)
      • 入栈(Push)
      • 出栈(Pop)
      • 获取栈顶元素(GetTop)
      • 获取栈的大小(StackSize)
      • 销毁栈(DestroyStack)
  • 关于栈的前端算法题
    • 有效的括号
    • 删除字符串中的所有相邻重复项
    • 简化路径

栈是一种数据结构,它是一种特殊的线性表。

栈具有 先进后出(LIFO)的特性 ,也就是最后进入栈的元素最先出栈,而最先进入栈的元素最后出栈。

栈通常有两个基本操作:压栈(push)出栈(pop)

压栈是将元素加入栈顶,而出栈是将栈顶元素移除。

栈可以用来进行函数调用的处理、表达式求值、以及其他需要后进先出特性的算法和数据结构。

栈通常用于实现递归算法表达式求值、以及其他需要临时存储临时数据的场景。

举个例子:

假设我们有一个整数栈,我们可以使用栈来模拟浏览器的“后退”功能。

每当用户访问一个新的网页时,我们将该网页的信息入栈。

当用户想要返回上一页时,我们可以从栈中弹出最近访问的网页信息,实现类似后退功能的效果。

栈的基本操作包括:

栈(Stack)是一种线性数据结构,只允许在一端进行插入和删除操作。栈的典型应用场景是函数调用栈、表达式求值、括号匹配等。

栈的操作主要包括以下几种:

初始化栈(InitStack)
  • 这是创建一个空栈的过程,通常包括分配一定的存储空间。
判断栈是否为空(IsStackEmpty)
  • 检查栈中是否没有元素,如果栈顶指针指向NULL或者栈的大小为0,那么栈为空。
入栈(Push)
  • 将一个元素添加到栈顶。例如,如果我们有一个栈S,我们想要将元素e推入栈中,我们可以这样做:
    Push(S, e)
    
    这将使得e成为新的栈顶元素。
出栈(Pop)
  • 删除栈顶元素并返回其值。例如,从栈S中弹出栈顶元素:
    value = Pop(S)
    
    这将删除栈顶元素,并将它的值赋给变量value。剩余的元素会向上移动,新的栈顶元素变为原来栈顶元素的下一个元素。
获取栈顶元素(GetTop)
  • 返回栈顶元素的值但不删除它。例如:
    top_element = GetTop(S)
    
获取栈的大小(StackSize)
  • 返回栈中元素的数量。
销毁栈(DestroyStack)
  • 释放栈占用的内存资源。

这些操作都是基于栈的后进先出(LIFO)原则进行的,即最后进入栈的元素最先被移出。

以下是一个简单的栈的实现示例,使用JavaScript语言实现:

class Stack {
  constructor() {
    this.items = [];
  }

  push(item) {
    this.items.push(item);
  }

  pop() {
    return this.items.pop();
  }

  top() {
    return this.items[this.items.length - 1];
  }

  isEmpty() {
    return this.items.length === 0;
  }
}

// 使用示例:
const stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack.pop()); // 输出3
console.log(stack.top()); // 输出2
console.log(stack.isEmpty()); // 输出false

在上面的示例中,我们定义了一个Stack类,包含了常用的栈操作方法:

  • push、
  • pop、
  • top
  • isEmpty。

我们可以通过创建一个Stack的实例来使用这些方法,对栈进行添加、删除、获取栈顶元素和判断是否为空等操作。

更多详细内容,请微信搜索“前端爱好者戳我 查看

关于栈的前端算法题

有效的括号

leetcode地址:https://leetcode.cn/problems/valid-parentheses/

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false

提示:

1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成

实现代码

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
    // 新建一个数组(创建一个栈)
    var stack = []

    // 循环数组
    for (let i = 0; i < s.length; i++) {
        // 记录当前字符
        const start = s[i]

        // 如果当前字符等于小括号或者大括号或者中括号的左半边,则入栈
        if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
            stack.push(s[i])
        } else {
            // 取出栈内最后一个元素
            const end = stack[stack.length - 1]
             // 如果当前字符等于小括号或者大括号或者中括号的有半边,则出栈
            if (start == ')' && end == '(' || start == '}' && end == '{' || start == ']' && end == '[') {
                stack.pop();
            } else {
                return false
            }
        }
    }

    return stack.length == 0
};

删除字符串中的所有相邻重复项

leetcode地址:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/

给出由小写字母组成的字符串 ‘S’,重复项删除操作会选择两个相邻且相同的字母,并删除它们

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

提示:

1 <= S.length <= 20000
S 仅由小写英文字母组成。

实现代码

/**
 * @param {string} s
 * @return {string}
 */
var removeDuplicates = function (s) {
    // 新建一个栈,空栈
    let stack = []

    //循环字符串
    for (value of s) {
        let prev = stack.pop() // 删掉头部元素

        // 当前删除元素不等于当前循环元素,则入栈,并且当前循环元素也入栈
        // 如果二者相等,则没有入栈,直接抛弃掉了
        if (prev != value) {
            stack.push(prev)
            stack.push(value)
        }
    }

    return stack.join('')

};

简化路径

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,‘…’)均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

  • 始终以斜杠 ‘/’ 开头。
  • 两个目录名之间必须只有一个斜杠 ‘/’ 。
  • 最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。

返回简化后得到的 规范路径 。

示例 1:

输入:path = "/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。 
示例 2:

输入:path = "/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
示例 3:

输入:path = "/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:

输入:path = "/a/./b/../../c/"
输出:"/c"

提示:

1 <= path.length <= 3000
path 由英文字母,数字,'.','/' 或 '_' 组成。
path 是一个有效的 Unix 风格绝对路径。

实现源码

/**
 * @param {string} path
 * @return {string}
 */
var simplifyPath = function (path) {
    // 新建一个栈,空栈
    let stack = []
    let str = ''; // 返回的字符

    // 拆分数组
    let arr = path.split('/')

    // 循环拆分的数组
    arr.forEach(item => {
        // item存在并且等于'..',则出栈
        if (item && item == '..') {
            stack.pop()
        } else if (item && item != '.') {
            // item存在并且不等于'.',则进栈
            stack.push(item)
        }
    })

    // 判断数组、栈是否有值,如果有值,则需要join一下,最后前面拼接字符串'//
    arr.length ? str = '/' + stack.join('/') : str = '/'

    // 返回字符串
    return str
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划】 【字典树】C++算法:472 连接词

作者推荐 【动态规划】458:可怜的小猪 涉及知识点 动态规划 字典树 LeetCode472 连接词 给你一个 不含重复 单词的字符串数组 words &#xff0c;请你找出并返回 words 中的所有 连接词 。 连接词 定义为&#xff1a;一个完全由给定数组中的至少两个较短单词&#xff08;不…

Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent

文章目录 概述Code源码分析 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#xff0c;使得应用程序中的不同组件可以独立地改变和复用逻辑&#xff0c;而无需直接进行通信。 …

C#上位机与欧姆龙PLC的通信11----【爆肝】上位机应用开发(Winform版)

1、先上图 前面10讲&#xff0c;让你爽煹了肝&#xff0c;已经进入最后收尾阶段&#xff0c;这节来个常规应用&#xff0c;让前面的技能直接飞上天&#xff0c;我们要做的界面软件是这样的&#xff0c;虽然没有潘金莲漂亮&#xff0c;但也是爆抱&#xff1a; 2、如何爆&#x…

win系统搭建Minecraft世界服务器,MC开服教程,小白开服教程

Windows系统搭建我的世界世界服务器&#xff0c;Minecraft开服教程&#xff0c;小白开服教程&#xff0c;MC 1.19.4版本服务器搭建教程。 此教程使用 Mohist 1.19.4 服务端&#xff0c;此服务端支持Forge模组和Bukkit/Spigot/Paper插件&#xff0c;如果需要开其他服务端也可参…

应用在LCD显示器电源插头里的氮化镓(GaN)MTC-65W1C

LCD&#xff08;Liquid Crystal Display&#xff09;显示器是利用液晶显示技术来进行图像表现的显示装置&#xff0c;从液晶显示器的结构来看&#xff0c;无论是笔记本电脑还是桌面系统&#xff0c;采用的LCD显示屏都是由不同部分组成的分层结构。LCD显示器按照控制方式不同可分…

网络编程的理论基础

文章目录 1 重点知识2 应用层3 再谈 "协议"4 HTTP协议4.1 认识URL4.2 urlencode和urldecode4.3 HTTP协议格式4.4 HTTP的方法4.5 HTTP的状态码4.6 HTTP常见Header4.7 最简单的HTTP服务器 3 传输层4 再谈端口号4.1 端口号范围划分4.2 认识知名端口号(Well-Know Port Nu…

2024美赛数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…

Linux动态分配IP与正向解析DNS

目录 一、DHCP分配 1. 动态分配 1.1 服务端服务安装 1.2 修改服务端dhcp配置 1.3 修改客户端dhcp&#xff0c;重启查询网卡信息 2. 根据mac固定分配 2.1 修改服务器端dhcp服务配置 2.2 客户端自动获取&#xff0c;查看网卡信息 二、时间同步 1. 手动同步 2. 自动同…

小汪,TCP连接和断连夺命6连问你可能扛得住?

目录 TCP三次握手连接和四次挥手断连的几处疑问 一、建立连接&#xff0c;为什么是三次握手&#xff0c;而不是二次握手&#xff1f; 二、为什么每次建立 TCP 连接时&#xff0c;初始化的序列号都要求不一样呢&#xff1f; 三、断开连接&#xff0c;为什么是四次握手&#x…

【C语言】ipoib驱动 - ipoib_cm_post_receive_srq_rss函数

一、ipoib_cm_post_receive_srq_rss函数定义 static int ipoib_cm_post_receive_srq_rss(struct net_device *dev,int index, int id) {struct ipoib_dev_priv *priv ipoib_priv(dev);struct ipoib_recv_ring *recv_ring priv->recv_ring index;struct ib_sge *sge;stru…

聚乙烯PE的特性有哪些?UV胶水能够粘接聚乙烯PE吗?

聚乙烯&#xff08;Polyethylene&#xff0c;PE&#xff09;是一种聚合物&#xff0c;是由乙烯&#xff08;ethylene&#xff09;单体通过聚合反应形成的合成塑料。以下是聚乙烯的一些主要化学特性&#xff1a; 1.化学式&#xff1a; 聚乙烯的基本化学式是 (C2H4)n&#xff0c;…

Camunda Sub Process

一&#xff1a;内嵌子流程 repositoryService.createDeployment().name("内嵌子流程").addClasspathResource("bpmn/embed_sub_process.bpmn").deploy(); identityService.setAuthenticatedUserId("huihui"); ProcessInstance processInstance …

【已解决】c++如何打印变量的类型

本博文源于笔者正在编写的c代码&#xff0c;在c/c中我们经常用auto去接一个变量&#xff0c;这样我们既可以不用知道变量或函数结果的类型&#xff0c;就可以轻松愉快编码&#xff0c;如果想要知道变量的类型呢&#xff1f;那就需要这样一个函数。 问题再现 想要用函数去打印…

使用numpy处理图片——90度旋转

在《使用numpy处理图片——镜像翻转和旋转》一文中&#xff0c;我们介绍了如何将图片旋转的方法。本文将使用更简单的方法旋转图片90度。 左旋转90度 import numpy as np import PIL.Image as Imagedata np.array(Image.open(the_starry_night.jpg))# left 90 rot90LeftWith…

SQL-条件查询与聚合函数的使用

目录 DQL-条件查询 1.语法 2.条件 常用的比较运算符如下: 常用的逻辑运算符如下: 案例: 聚合函数 1.常见的聚合函数 2.聚合函数的语法 案例&#xff1a; &#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客…

pycharm导入etree报Cannot find reference ‘etree‘ in ‘__init__.py‘ more... (Ctrl+F1)

问题 发现 from lxml import etree的时候&#xff0c;etree报错了。提示Cannot find reference etree in __init__.py more... (CtrlF1)。 解决办法 后面发现是pycharm自己的BUG&#xff0c;所以写了新的写法

turnjs实现翻书效果

需求&#xff1a;要做一个效果&#xff0c;类似于阅读器上的翻书效果。 咱们要实现这个需求就需要使用turnjs这个插件&#xff0c;他的官网是turnjs官网。 进入官网后可以点击 这个按钮去下载官网的demo。 这个插件依赖于jQuery&#xff0c;所以你的先安装jQuery. npm insta…

SwiftUI之深入解析Frame Behaviors

一、Frame 简介 当开始使用 SwiftUI 时&#xff0c;可能接触到的第一个修饰符是 frame(width:height:alignment)&#xff0c;定义 frame 是 SwiftUI 最具挑战性的任务之一&#xff0c;当我们使用修饰符&#xff08;如 .frame().&#xff09;时&#xff0c;会发生很多事情。Swi…

抵御爬虫的前线护盾:深度解读验证码技术的演变历程

一.前言 在当今信息技术迅速发展的背景下&#xff0c;网站和在线服务面临着日益增长的自动化访问威胁&#xff0c;这些大多来自于各类爬虫程序。这种大量的自动化访问不仅对网站的正常运行构成压力&#xff0c;还可能导致敏感数据的泄露&#xff0c;甚至被用于不正当竞争和恶意…

小议CompletableFuture 链式执行和响应式编程

相关文章&#xff1a; 用最简单的方式理解同步和异步、阻塞与非阻塞CompletableFuture 实战 背景 昨晚和一个朋友讨论了他在开发过程中遇到的一个场景设计问题。这个场景可以简化为&#xff1a;服务接收到一个需要处理的任务请求&#xff0c;然后立即返回。这个任务需要经过…