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
};

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

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

相关文章

如何将ArcGIS工程文件迁移到ArcGIS Pro内

当你刚接触ArcGIS Pro的时候&#xff0c;尝试新建一个工程文件会发现工程文件的后缀已经改变&#xff0c;那么以前在ArcGIS内辛苦制作的工程文件是否就不能在ArcGIS Pro内使用了&#xff0c;答案是否定的&#xff0c;对此Esri也给出了解决方案&#xff0c;这里为大家介绍一下迁…

MergeTwoSortedLists 【合并有序链表】

有种归并排序的感觉 链表好久不用有些生疏了&#xff0c;思想思路是对的&#xff0c;但是代码写出来有问题&#xff0c;。 写完说点感受&#xff1a; 当时在学校学习链表的时候&#xff0c;就了解到链表分为“有头节点”和“无头节点”的链表&#xff0c;所以这里好像就不练&am…

Docker数据持久化

数据持久化 在容器层的 UnionFS&#xff08;联合文件系统&#xff09;中对文件/目录的任何修改&#xff0c;无论是手工修改还是 容器在运行过程中的修改&#xff0c;在该容器丢失或被删除后这些修改将全部丢失。即这些修改是无 法保存下来的。若要保存下来这些修改&#xff0c;…

如何一键添加引号和英文逗号,然后可以放入SQL中使用 → WHERE USER_NAME IN (‘张三‘,‘李四‘,‘王五‘)

如何一键添加引号和英文逗号&#xff0c;然后可以放入SQL中使用 → WHERE USER_NAME IN&#xff08;张三,李四,王五&#xff09; 一、背景二、解决方法三、一键添加引号和英文逗号的教程 一、背景 在日常开发中&#xff0c;当处理VARCHAR或VARCHAR2类型的字段时&#xff0c;很…

2024,AI Agent的密集爆发之年

最近这几天&#xff0c;相信已经有很多朋友看到了关于GPT Store、Vision Pro、Rabbit R1、AI pin、英伟达ACE&#xff08;Avatar Cloud Engine&#xff09;、钉钉个人助理、荣耀MagicOS 8.0等各类和AI技术深度结合的AI Agent或者承载AI Agent的平台。有些是和个人应用相关&…

写一个简单的Java的Gui文本输入窗口,JFrame的简单使用

JFrame是指一个计算机语言-java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。 Swing的三个基本构造块:标签、按钮和文本字段;但是需要个地方安放它们,并希望用户知道如何处理它们。JFrame 类就是解决这个问题的——它是一个容器…

【webpack学习】webpack插件之“html-webpack-plugin”

1. 介绍 html-webpack-plugin 是一个Webpack插件&#xff0c;用于简化在构建过程中创建HTML文件的过程。它的作用是根据你的Webpack构建配置&#xff0c;在构建时自动生成一个或多个HTML文件&#xff0c;并将打包生成的JavaScript和CSS文件自动引入到这些HTML文件中。 2. 功能…

Redis在项目开发中的应用

Spring Boot集成Redis构建博客应用 在这个示例中&#xff0c;我们将展示如何使用Spring Boot和Redis构建一个简单的博客应用&#xff0c;包括文章发布、点赞和评论功能。 1. 添加依赖 首先&#xff0c;我们需要在pom.xml文件中添加Spring Boot和Redis的依赖项。 <!-- Sp…

docsify阿里云上部署

使用Markdown格式安装和部署Nginx 本文将介绍如何使用Markdown格式安装和部署Nginx。 步骤 安装Nginx&#xff1a; 打开终端&#xff0c;并根据您的操作系统执行以下命令来安装Nginx&#xff1a; 对于Ubuntu或Debian系统&#xff1a; sudo apt-get update sudo apt-get insta…

损失函数篇 | RT-DETR 引入 Inner-IoU 考虑边框形状与尺度的度量

作者导读:Inter-IoU:基于辅助边框的IoU损失 论文地址:https://arxiv.org/abs/2311.02877 作者视频解读:https://www.bilibili.com 开源代码地址:https://github.com/malagoutou/Inner-IoU 随着探测器的快速发展,边界框回归(BBR)损失函数不断更新和优化。然而,现有基…

C++进阶(三)多态

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、多态的概念1、概念 二、多态的定义及实现1、多态的构成条件2、虚函数3、虚函数的重写4、C…

酒茶元宇宙:探索未来生活的无限可能

随着科技的飞速发展&#xff0c;人类对于未来生活的想象也在不断地拓展。在这个过程中&#xff0c;茶酒文化作为一种源远流长的传统文化&#xff0c;也在逐渐融入现代科技&#xff0c;为人们带来全新的生活体验。茶酒元宇宙&#xff0c;就是这样一个将茶酒文化与科技相结合的全…

华为机试真题实战应用【赛题代码篇】-最小循环子数组(附Java、python和C++代码)

目录 题目描述 解题思路 暴力查找 转字符串匹配 代码实现 Java

C++从零基础到入门(2)—— (if、switch、for、while语句)

目录 一、if 条件语句 1.if 语句 2.if-else 语句 3.if-else if-else 语句 4.嵌套 if 语句 二、switch 语句 1.switch 语句基本语法 2.表示 switch 表达式的数据类型 &#xff08;1&#xff09;整型 &#xff08;2&#xff09;字符型 &#xff08;3&#xff09;枚举型…

golang常见算法题

1、 翻转一个字符串 2、 判断两个给定的字符串排序后是否一致 3、 判断字符串中字符是否全都不同 4、交替打印数字和字母 5、 字符串对位交换 6、 返回一个数组所有可能排列 7、有两个切片 []int{1,3,5,7}. []int{2,4,6,8,9} 将两个切片按照递增合并为一个新的切片[]int{1,2,3,…

Odrive 学习系列一:vscode 编译Odrive

搭建环境可参考Markerbase教程,很详细了。 简单说一两点: 解压ODrive-fw-v0.5.1.zip: 打开ODrive-fw-v0.5.1文件夹,找到Firmware文件夹,用vscode打开该文件夹: 按照以下内容操作: 编译工程: 打开 中断(terminal),输入 make -j4 回车 进行编译。编译…

【C语言小游戏】贪吃蛇

文章目录 1.引言2.运行图2.涉及知识3 Windows API3.1 控制台3.2 控制台屏幕坐标3.3 操作句柄3.4 控制台屏幕光标3.5 监视按键 4. 设计说明5. 完整代码 1.引言 使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇 实现基本的功能&#xff1a; 贪吃蛇地图绘制蛇吃⻝物的…

.NET 反射的介绍和简单应用

什么是反射&#xff1f; 反射就是动态发现类型信息的能力。它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型&#xff0c;这些信息在设计时是未知的&#xff0c;这种能力类似于后期绑定。反射还支持的更高级的行为&#xff0c;能在运行时动态创建新类型&#xff0…

设计模式-数据映射模式

设计模式专栏 模式介绍模式特点应用场景技术难点代码示例Java实现数据映射模式Python实现数据映射模式 数据映射模式在spring中的应用 模式介绍 数据映射模式是一种将对象和数据存储映射起来的数据访问方式。具体来说&#xff0c;对一个对象的操作会映射为对数据存储的操作。这…

GO自研微服务框架-路由实现

路由实现 1.不用框架 不用框架的路由实现 package mainimport ("fmt""log""net/http" )func main() {http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) {fmt.Fprintf(writer, "%s 欢迎来到…