《数据结构与算法JavaScript描述》栈(学习笔记C04)

手把手教你用 JavaScript 实现常见数据结构与算法 你是否遇到过这样的场景?写前端代码时想优化列表渲染性能,却不知道用链表还是数组更高效;面试时被问“用 JS 实现一个栈”,结果卡壳在 API 设计;想自己写个小框架,却对虚拟 DOM 的树结构遍历一头雾水?本文正是为解决这些问题而生:覆盖6 类核心数据结构(数组、链表、栈、队列、树、图)和5 大经典算法(排序、搜索、递归、动态规划、贪心),用 JS 代码+生活案例,让你“既能写代码,又懂为什么这么写”。本文从“生活场景”切入,先讲数据结构(像认识工具),再讲算法(像学习工具的用法),最后用实战案例串联。 阅读详情

相关概念

1.栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。
2.栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。
3.入栈使用 push() 方法,出栈使用 pop() 方法,peek() 方法则只返回栈顶元素(预览栈顶元素不删除)。

代码

// 栈的实现
// 常规操作: 
// 压入栈 push()
// 弹出栈 pop()
// 预览栈顶 peek()
// 顶元素位置 变量 top
// 清除栈内所有元素 clear()
// 记录栈内元素个数 length
// 表示栈内是否含有元素 empty
// 底层实现结构--数组

// 定义Stack类的构造函数
function Stack() {
    this.dataStore = []
    this.top = 0
    this.push = push
    this.pop = pop
    this.peek = peek
    this.clear = clear
    this.length = length
}    
// push()
function push(element) {
    this.dataStore[this.top++] = element
}
// pop()
function pop() {
    return this.dataStore[--this.top]
}
// peek()
function peek() {
    return this.dataStore[this.top-1]
}
// length()
function length() {
    return this.top
}
// clear()
function clear() {
    this.top = 0
}
// 测试
var s = new Stack()
s.push('xx1')
s.push('xx2')
s.push('xx3')
console.log('length: ' + s.length())
console.log('s.peek()' + s.peek())
var popped = s.pop()
console.log('The popped element is: ' + popped)
console.log('s.peek()' + s.peek())
s.push('xx4')
console.log('s.peek()', s.peek())
s.clear()
console.log('length: ',s.length())
console.log('s.peek()', s.peek())
s.push('xx5')
console.log(s.peek())
 
// 使用栈解决问题

// 1.数制间的相互转换

function mulBase(num, base) {
    var s = new Stack()
    do {
        s.push(num % base)
        num = Math.floor(num /= base)
    } while (num > 0)
    var converted = ''
    while (s.length() > 0) {
        converted += s.pop()
    }
    return converted
}
// 1.1转二进制
var num = 32
var base = 2
var newNum = mulBase(num, base)
// console.log(num + ' converted to base ' + base + ' is ' + newNum)
// 1.2转八进制
num = 125
base = 8
var newNum = mulBase(num, base)
// console.log(num + ' converted to base ' + base + ' is ' + newNum)

// 2.回文
function isPalindrome(word) {
    var s = new Stack()
    for (var i = 0; i < word.length; ++i) {
        s.push(word[i])
    }
    var rword = ''
    while (s.length() > 0) {
        rword += s.pop()
    }
    if (word == rword) {
        return true
    } else {
        return false
    }
}

var word = 'hello'
if (isPalindrome(word)) {
     console.log(word + ' is a palindrome.')
} else {
     console.log(word + ' is not a palindrome')
}
var word = 'racecar'
if (isPalindrome(word)) {
     console.log(word + ' is a palindrome.')
} else {
     console.log(word + ' is not a palindrome')
}

// 递归工作原理:http://bit.ly/lenDGE3

// 3.阶乘递归
function facorial(n) {
    if (n === 0) {
        return 1
    } else {
        return n*facorial(n-1)
    }
}
var num1 = facorial(5)
console.log('递归一', num1)
function fact(n) {
    var s = new Stack()
    while (n > 1) {
        s.push(n--)
    }
    var product = 1
    while (s.length() > 0) {
        product *= s.pop()
    }
    return product
}
var num2 = fact(5)
console.log('递归二', num2)

力扣相关题目

以下题目难度全部为简单:

1.1题目描述:

  1. 有效的括号
    给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
    有效字符串需满足:
    1.左括号必须用相同类型的右括号闭合。
    2.左括号必须以正确的顺序闭合。
    注意:空字符串可被认为是有效字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses

1.2.我的解答

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
	// 思路:原数组与空数组(相当于将原数组对折与新数组比较)
	var s = s.split('')
	var arr = []
	for(var i=0; i<s.length; i++){
	    if(s[i] === '('){
	        arr.push(')')
	    }else if(s[i] === '['){
	        arr.push(']')
	    }else if(s[i] === '{'){
	        arr.push('}')
	    }else if(arr.pop() !== s[i]){
	        return false
	    }
	}
	if(arr.length){
	    return false
	}else{
	    return true
	}
};

2.1.题目描述:

  1. 下一个更大元素 I
    给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
    nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

2.2.示例:

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-i。

2.3.我的解答:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var nextGreaterElement = function(nums1, nums2) {
    var arr = []
    for(var i=0; i<nums1.length; i++){
         var index = nums2.indexOf(nums1[i])+1
         var arrIn = []
         for(var j=index; j<nums2.length; j++){
             if(nums2[j]>nums1[i]){
                 arrIn.push(nums2[j])
             }
         }
         if(arrIn.length>0){
             arr.push(arrIn[0])
         }else{
             arr.push(-1)
         }
    }
    return arr 
};

3.1.题目描述:

  1. 删除最外层的括号
    有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。
    如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
    给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i 是有效括号字符串原语。
    对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。

3.2.示例:

输入:"(()())(())"
输出:"()()()"
输入:"()()"
输出:""

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-outermost-parentheses

3.3.我的解答:

/**
 * @param {string} S
 * @return {string}
 */
var removeOuterParentheses = function(S) {
    // 从 0 开始计数,遇 a 则 +1 遇 b 则 -1 
    // 当 a=1 且 b=0 就为最外层括号,记下序号
    var arr = S.split('')
    var indexArrB = []
    var count = 0
    for (var i=0; i<arr.length; i++) {
        if (arr[i] == '(') {
           count++ 
        } else {
           count--  
        }
        if(count==0){
            indexArrB.push(i)
        }
    }
    // console.log('序号数组其一--',indexArrB)
    // 需要删除的元素序号
    var indexArrA = []
    for(var i=0; i<indexArrB.length-1; i++) {
        indexArrA.push(indexArrB[i]+1)
    }
    indexArrA.unshift(0)
    // console.log('有序数组其二',indexArrA)
    var index = indexArrA.concat(indexArrB)

    var indexArr = []
    for(var i=0; i<arr.length; i++){
        if(index.indexOf(i) == -1) {
            indexArr.push(arr[i])
        }
    }
    return indexArr.join('')
};
【经典回放】多种语言系列数据结构算法:栈(JavaScript版) 本文采用JavaScript语言实现栈结构算法并举例应用。 JavaScript的栈是数组对象中自动提供的,这点如同C#,实际也不需要自己编写什么栈的程序,如果你用: var s=new Array(); 定义一个s的数组,则这个s上将有以下的方法可供使用: 其中:FF: Firefox, IE: Internet Explorer 而这个对象提供的属性,则如下表: FF: F... 阅读详情

相关推荐

MATPOWER下载安装教程

将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2016b\bin目录下。原来的窗口中多了很多文件路径,点击【保存】,再点击【关闭】选择所要添加的MATPOWER文件夹,点击【选择文件夹】二、将MATPOWER放在bin目录下。找到菜单栏的【设置路径】点击【添加并包含子文件】一、从官网下载后解压。

weixin_47365903的博客 2万+

Javascript描述-数据结构与算法

☆     数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。      下面是我总结整理出的关于数据结构与算法的相关内容,如有错误,欢迎交流。本文中对于方法的封装均采用JavaScript语言来实现。...

weixin_43689100的博客 402

Gazebo仿真环境下的强化学习实现

实际上利用Gazebo进行强化学习无非是环境获取上的不同,Gazebo的环境控制需要使用ROS服务进行控制,状态可以通过Gazebo进行获取,同时某些必要数据需要从话题中获取,最重要的是组织获取 的数据(通过话题等)与控制Gazebo的仿真步骤之间的组合。强化学习的手段与传统算法无异,强化学习方法最重要的是要确定动作空间、状态空间、奖励空间,这三个空间是work的前提。在笔者自己的环境中,将获取里程计的话题以及获取激光点的数据替换成为了自己的本机的仿真环境匹配的话题。

Moresweet 猫甜 6450

资料分享:送你一本《数据结构与算法JavaScript描述》电子书!

数据结构 是掌握计算机编程必须具备的技能。通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表、栈、队列、字符串、动态数字、整数集合、树、图、搜索、排序等涉及的算法全部写一遍。写完之后,基本上就把这门语言搞定了。 今天给大家分享的就是我从网上找到的利用 JavaScript 语言来实现各种数据结构的算法,希望这本电子书对学习 JavaScript 想从事前端工作的读者有益。...

老马的程序人生 4380

UE5 中 Python 编程:Python 代码加载到 UE5 中,如何供蓝图节点调用

配置 python 代码的路径,使 UE5 启动时,加载代码文件。重启之后,在蓝图中右键,就能搜索到你定义的方法了。参数为 str 字符串类型,返回值为 向量数组。注意:一定要 重启 UE5。

topcss的专栏 3996

不懂就学之挑战成为WorldQuant Brain顾问的第1天

WorldQuant Brain 是由 WorldQuant 公司开发的一个基于人工智能和机器学习的量化研究平台,旨在帮助量化研究员发现和构建有效的投资策略。WorldQuant 是一家全球领先的量化投资公司,专注于利用数据科学、技术和金融工程开发量化交易策略。

Yanbang1的博客 8387

数据结构与算法书籍推荐

学习数据结构与算法,还是很有必要看几本相关的书籍,但根据不同基础的人,合适看的书也不一样,因此,针对不同层次、不同语言的人,推荐几本市面上口碑不错的书。 1. 入门级 针对刚入门的同学,建议不要急着去看那些经典书,像《算法导论》、《算法》这些比较经典、权威的书。虽然书很好,但看起来很费劲,如果看不完,效果会很不好。所以建议先看两本入门级的趣味书: 《大话数据结构》 《算法图解》 大话数据结构 ...

张许平的博客 7万+

同花顺 python量化交易_开启量化第一步!同花顺iFinD数据接口免费版简易操作教程...

来源:雪球App,作者: 同花顺-iFinD,(https://xueqiu.com/6706494343/141951051)金融市场波动频繁,投资往往会夹杂非理性的情绪。而量化交易,旨在以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略,辅助投资者进行理性投资。不过计算机分析存在一定的技术门槛,有没有简单易学的量化交易方式,能够...

weixin_35911805的博客 2万+

【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录

文章目录1. 专栏简介2. 专栏地址3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之《数据结构与算法》 3. 专栏目录 【经典回放】多种语言系列数据结构算法:二叉树(JavaScript版) 【经典回放】多种语言系列数据结构算法:二叉树(C#版) 【经典回放】多种语言系列数据结构算法:树(C#、JavaScript、VB6版) 【经典回放】多种语言系列数据结构线性表之一:顺序表 【经典回放】多种语言系列数据结构线性表之二:链表 【经典回放】多种语言系列数据结构算法:串(C

智慧空间实验室 814

30. 如何使用 SEGW 的 redefine 功能对 SAP 标准 OData 服务进行扩展

SAP 发布了很多标准的 Fiori 应用,可以通过笔者的文章里提到的进行浏览。比如 My Opportunities 就是 SAP CRM 领域的一个 Fiori 应用:下图是 Opportunity 明细页面的 Info 标签页:假设我们想在这些标准字段的末尾增添一个新字段 Created By,用来维护当前 Opportunity 的创建者。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1174

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 165

Javascript数据结构与算法

文章目录Javascript数据结构与算法什么是数据结构与算法线性结构数组数组使用的API链表链表原理自定义链表双向链表栈自定义栈栈常见的操作栈的封装栈的应用十进制转二进制队列自定义队列队列常见的操作队列的封装优先级队列队列的应用哈希表哈希表理论认识哈希表认识哈希化地址的冲突哈希表效率自定义哈希表哈希函数哈希表实现哈希扩容树结构树相关的概念树的基本概念二叉树的概念二叉搜索树图结构排序&搜索...

MOOG007的博客 368

hwasan实例分析踩内存之一:camx进程stack tag-mismatch的三种解决方案

hwasan实例分析踩内存之一:camx进程stack tag-mismatch的三种解决方案。

1291

JavaScript —— 算法思想之栈数据结构

`数据结构栈`,我们可以把其理解为一个羽毛球筒,它的进出口永远只有一个。然而,最先进去的羽毛球(工作栈),则是在最底下,也就是`栈底`。以此类推,最后一个进去的,永远都是在其他羽毛球的上面,也就是`栈顶`。

LizequaNNN的博客 473

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【数据结构与算法学习笔记】

本系列文章为作者学习数据结构与算法所作笔记,笔记参考陈斌老师的课程“数据结构与算法 Python版”和经典的数据结构教材《数据结构(C语言版)》(作者:严蔚敏),后期也参考了LetCode的题解。

floating_heart的博客 3101

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JavaScript常用的数据结构和算法 ——封装栈类

简单说说 最近这几天学习到了平台期了,就是一直处于一个相同的学习水平,怎么也进步不了。之前看jQuery学习了一些常用的方法,操作dom元素、事件、动画效果、ajax等,总感觉自己只是了解了表面,想深入呢,也不知道怎么去深入。哎,又有点小无措的感觉了。 然后呢,七月过去了一半,es678也过了一遍,了解了js新增的语法以及异步编程。对于异步编程现在掌握不好,因为真的真的真的不会后端,什么抓取数据、异步交互都不知道怎么操作的。仔细想了想,剩下的半个月俩星期,我要把HTML5深入一下,其中穿插着复习css重难点

爱前端的程序媛的博客 393

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JavaScript实现数据结构与算法(二)线性结构

JavaScript实现数据结构与算法(二)线性结构 目录 1. 重要性 2. 线性结构【本文】 3. 哈希表 4. 树结构 5. 图结构 6. 排序和搜索 2. 线性结构 2.1 数组的特点 2.1.1 普通数组 优点:通过下标取元素效率非常高。 缺点:常见语言数组不能存放不同类型的数据,所以一般都先封装一个Object类型 2.1.2 底层数组 扩容方法:新建一个大的数组,把原有数组写进去,再...

weixin_43545225的博客 1700

《数据结构与算法JavaScript描述》队列(学习笔记C05)

队列相关概念代码 相关概念 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。 队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。 入队操作在队尾插入新元素,出队操作删除队头的元素。 peek()读取队头的元素。 代码 // 队列--先进先出--FIFO // 常规操作: // 入队 // 出队 // 返回队头元素 peek() // length // clear() // 底层实现结构--数组 // 数组: push() 末尾添加元素 // 数组: shi

yuhong's blog 240

JavaScript栈的实现

栈是一种遵从先进后出(LIFO)原则的有序集合。 新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。 在栈里,新元素都靠近栈顶,旧元素都接近栈底 昨天因为有点事没有更新,今天打算给大家讲讲JavaScript实现的数据结构 以前学C/C++的时候,感觉算法还是比较重要的,但是前端好像涉及的不多 其实作为程序员,了解一些基本算法应该是必须的栈的理解栈这种数据结构其实很好

尐轩web前端网络日志 2292

数据结构与算法--栈(Stack)--JS

数据结构与算法–栈(Stack)–JS 数据结构(存储和组织数据的方式)包含以下几种结构: 数组(Array)、栈(Stack)、队列(Queue)、链表(Lisked list)、 图(Graph)、散列表(Hash)、树(Tree)、堆(Heap) 栈 先进后出(FILO),进出的一端为栈顶、不动的一端为栈底 函数调用栈 多个函数相互调用,A调用B,B又调用C,C又调用D,会将A压入栈,A没有执行完不会弹出栈,在执行A的过程中调用了B,把B压入栈,依次这样,最终D执行完了把D弹出栈,再依次把CBA弹出栈

weixin_44999716的博客 1897

【数据结构与算法——TypeScript】数组、栈、队列、链表

什么是算法(Algorithm)?算法(Algorithm)的认识:解决问题的过程中,不仅仅 数据的存储方式会影响效率,算法的优劣也会影响效率;前端算法学习:**算法的通俗**理解 - **Algorithm**这个单词本意就是 **解决问题的办法/步骤逻辑**。 - **数据结构的实现,离不开算法**。

羊羊羊羊羊羊羊的博客 1710

JavaScript数据结构与算法(4)栈和队列

1.

yangyang的专栏 234

栈的pop和peek_学习数据结构与算法之栈与队列

起因最近要准备校招,打开某网站准备开始刷题,发现算法题根本无法动手,于是觉得这块需要恶补。(⊙v⊙)嗯,至少得先知道概念吧。于是翻出了机房里的这本《学习JavaScript数据结构与算法》开始学习程序员的基础知识。这本书用了我最熟悉的JS来实现各种数据结构和算法,而且书很薄,可以说是一本不错的入门教程。虽然我是个前端,但是计算机基础不能丢下。栈栈可以理解为一种特殊的数组。遵循后进先出(LIFO)的...

weixin_42299140的博客 1251

JavaScript 数据结构与算法(三)栈

目录 JavaScript 数据结构与算法(三)栈 什么是栈 程序中的栈结构 练习 栈结构实现 栈常见的操作 JavaScript 代码实现栈结构 测试封装的栈结构 栈结构的简单应用 代码实现 测试 JavaScript 数据结构与算法(三)栈 数组是一个线性结构,并且可以在数组的任意位置插入和删除元素。 但是有时候,我们为了实现某些功能,必须对这种任意性加以限制。 栈和队列就是比较常见的受限的线性结构。 什么是栈 栈(stack)是一种运算受限的线性表: LIFO(la..

qq_45738592的博客 247

Javascript算法和数据结构

什么是算法和数据结构 数据结构:计算机中存储和组织数据的方式 算法:解决办法的逻辑/操作 数组 JS数组就是API的调用 栈 栈是受限的线性结构:(生活中类似于自助餐的托盘) 只能在一端添加/删除元素(栈顶) 进入:进栈(压栈) 出去:出栈(退 栈) 函数调用栈 A调用B,B调C,C调D D,C,B,A的弹栈顺序 一个栈结构面试题 有6...

大灰狼的小绵羊哥哥的博客 965

视频教程-C语言开发之数据结构与算法一-C/C++

C语言开发之数据结构与算法一 从事技术开发已经10年左右,拥有丰富的开发经验...

weixin_31769585的博客 718
上一篇: 《数据结构与算法JavaScript描述》列表(学习笔记C03)
下一篇: 《数据结构与算法JavaScript描述》队列(学习笔记C05)
magic-fish
博客等级 码龄9年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值