数据结构与算法JavaScript描述练习------第4章栈

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

1. 栈可以用来判断一个算术表达式中的括号是否匹配。编写一个函数,该函数接受一个算 术表达式作为参数,返回括号缺失的位置。下面是一个括号不匹配的算术表达式的例 子:2.3 + 23 / 12 + (3.14159×0.24。

function checkParentheses(expression) {
	var stack = new Stack();
	var unmatchedPositions = [];
	for (var i = 0; i < expression.length; i++) {
		var ch = expression[i];
		if (ch === '(') {
			stack.push(i);
		} else if (ch === ')') {
			if (stack.length() > 0) {
				stack.pop();
			} else {
				unmatchedPositions.push(i);
			}
		}
	}
	while (stack.length() > 0) {
		unmatchedPositions.push(stack.pop());
	}
	return unmatchedPositions.sort((a, b) => a - b);
}

const expression = '2.3) (+ 23 / 12 + (3.14159×0.24';
const result = checkParentheses(expression);
console.log(result);

2. 一个算术表达式的后缀表达式形式如下: op1 op2 operator 使用两个栈,一个用来存储操作数,另外一个用来存储操作符,设计并实现一个 JavaScript 函 数,该函数可以将中缀表达式转换为后缀表达式,然后利用栈对该表达式求值。

function infixToPostfix(expression) {
    var precedence = {
		'+': 1,
		'-': 1,
		'*': 2,
		'/': 2,
		'^': 3,
		'(': 0
	};
	
	var operatorStack = new Stack();
	var output = [];
	
	for (var i = 0; i < expression.length; i++) {
		var ch = expression[i];
		if (!isNaN(ch) || ch === '.') {
			output.push(ch);
		} else if (ch === '(') {
			operatorStack.push(ch);
		} else if (ch === ')') {
			while (operatorStack.peek() !== '(') {
				output.push(' ');
				output.push(operatorStack.pop());
				output.push(' ');
			}
			operatorStack.pop();
		} else if (precedence[ch]) {
			while (operatorStack.length() > 0 && precedence[operatorStack.peek()] >= precedence[ch]) {
				output.push(' ');
				output.push(operatorStack.pop());
				output.push(' ');
			}
			operatorStack.push(ch);
		}
	}
	
	while (operatorStack.length() > 0) {
		output.push(' ');
		output.push(operatorStack.pop());
		output.push(' ');
	}
	
	return output.join('');
}


function evaluatePostfix(postfixExpression) {
    var operandStack = new Stack();
	
	for (var i = 0; i < postfixExpression.length; i++) {
		var token = postfixExpression[i];
		if (token.trim() === '') {
			continue;
		}
		else if (!isNaN(token)) {
			operandStack.push(parseFloat(token));
		} else {
			var operand2 = operandStack.pop();
			var operand1 = operandStack.pop();
			var result;
			switch (token) {
				case '+':
					result = operand1 + operand2;
					break;
				case '-':
					result = operand1 - operand2;
					break;
				case '*':
					result = operand1 * operand2;
					break;
				case '/':
					result = operand1 / operand2;
					break;
				case '^':
					result = Math.pow(operand1, operand2);
					break;
			}
			operandStack.push(result);
		}
	}
	return operandStack.pop();
}


var infixExpression = "2.3 + 23 / (12 + 3.14159) * 0.24";
var postfixExpression = infixToPostfix(infixExpression);
console.log("Postfix Expression:", postfixExpression);
console.log("Postfix Expression:", postfixExpression.split(' '));

var result = evaluatePostfix(postfixExpression.split(' '));
console.log("Result:", result);

3. 现实生活中栈的一个例子是佩兹糖果盒。想象一下你有一盒佩兹糖果,里面塞满了红 色、黄色和白色的糖果,但是你不喜欢黄色的糖果。使用栈(有可能用到多个栈)写一 段程序,在不改变盒内其他糖果叠放顺序的基础上,将黄色糖果移出。

function removeYellowCandies(candyBox) {
	var tempStack = new Stack();
	var originalStack = new Stack();
	
	while (candyBox.length() > 0) {
		var candy = candyBox.pop();
		if (candy != 'yellow') {
			tempStack.push(candy);
		}
	}
	
	while (tempStack.length() > 0) {
		originalStack.push(tempStack.pop());
	}
	
	return originalStack;
}

var candyBox = new Stack();
candyBox.push('red');
candyBox.push('yellow');
candyBox.push('white');
candyBox.push('yellow');
candyBox.push('red');
console.log("Original Candy Box:", candyBox.dataStore); 
var cleanedCandyBox = removeYellowCandies(candyBox);
console.log("Cleaned Candy Box:", cleanedCandyBox.dataStore);

记录一下Stack的ABT实现:

function Stack() { 
	this.dataStore = []; 
	this.top = 0; 
	this.push = push; 
	this.pop = pop; 
	this.peek = peek; 
	this.clear = clear; 
	this.length = length; 
} 
 
function push(element) { 
	this.dataStore[this.top++] = element; 
} 
 
function peek() { 
	return this.dataStore[this.top-1];
} 
 
function pop() { 
	return this.dataStore[--this.top]; 
} 
 
function clear() { 
	this.top = 0; 
} 
 
function length() { 
	return this.top; 
}	



function infixToPostfix(expression) {
    var precedence = {
		'+': 1,
		'-': 1,
		'*': 2,
		'/': 2,
		'^': 3,
		'(': 0
	};
	
	var operatorStack = new Stack();
	var output = [];
	
	for (var i = 0; i < expression.length; i++) {
		var ch = expression[i];
		if (!isNaN(ch) || ch === '.') {
			output.push(ch);
		} else if (ch === '(') {
			operatorStack.push(ch);
		} else if (ch === ')') {
			while (operatorStack.peek() !== '(') {
				output.push(' ');
				output.push(operatorStack.pop());
				output.push(' ');
			}
			operatorStack.pop();
		} else if (precedence[ch]) {
			while (operatorStack.length() > 0 && precedence[operatorStack.peek()] >= precedence[ch]) {
				output.push(' ');
				output.push(operatorStack.pop());
				output.push(' ');
			}
			operatorStack.push(ch);
		}
	}
	
	while (operatorStack.length() > 0) {
		output.push(' ');
		output.push(operatorStack.pop());
		output.push(' ');
	}
	
	return output.join('');
}


function evaluatePostfix(postfixExpression) {
    var operandStack = new Stack();
	
	for (var i = 0; i < postfixExpression.length; i++) {
		var token = postfixExpression[i];
		if (token.trim() === '') {
			continue;
		}
		else if (!isNaN(token)) {
			operandStack.push(parseFloat(token));
		} else {
			var operand2 = operandStack.pop();
			var operand1 = operandStack.pop();
			var result;
			switch (token) {
				case '+':
					result = operand1 + operand2;
					break;
				case '-':
					result = operand1 - operand2;
					break;
				case '*':
					result = operand1 * operand2;
					break;
				case '/':
					result = operand1 / operand2;
					break;
				case '^':
					result = Math.pow(operand1, operand2);
					break;
			}
			operandStack.push(result);
		}
	}
	return operandStack.pop();
}


var infixExpression = "2.3 + 23 / (12 + 3.14159) * 0.24";
var postfixExpression = infixToPostfix(infixExpression);
console.log("Postfix Expression:", postfixExpression);
console.log("Postfix Expression:", postfixExpression.split(' '));

var result = evaluatePostfix(postfixExpression.split(' '));
console.log("Result:", result);

JavaScript深入讲解数据结构与算法 本文还有配套的精品资源,点击获取 简介:《用JavaScript来介绍数据结构与算法》是一份系统的编程资料,通过JavaScript语言深入剖析数据结构与算法的核心概念。本资料详细介绍和比较了数组、链表、栈、队列、哈希表、树和图等数据结构,并且讨论了排序、搜索、动态规划、贪心算法、回溯法等重要算法。掌握这些知识点对于JavaScript开发者而言是提升编程技能和优化代码性能... 阅读详情

相关推荐

CHIP-Seq数据分析流程

文章目录CHIP-Seq数据分析流程相关软件安装数据下载将SRA转化为fastq文件数据质控,过滤数据质控然后进行质控,过滤低质量reads,去接头比对下载小鼠参考基因组的索引和注释文件比对sam文件转bam为bam文件建立索引载入IGV查看用MACS call peak安装MACS结果注释与可视化 CHIP-Seq数据分析流程 相关软件安装 所需要的软件有sratoolkit, fastqc,bowtie2,samtools,macs2,htseq-count,bedtools和前面RNA-seq数据分析

bio_meimei的博客 8791

《数据结构与算法JavaScript描述》

《数据结构与算法JavaScript描述》 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115363398 上架时间:2014-8-5 出版日期:2014 年8月 开本:16开 版次:1-1 所属分类:计算机 > 软件与程序设计 > 网络编程 > ...

weixin_30607029的博客 747

Raid5损坏两块盘

  以下为浪潮Inspur NF5460M4型号服务器故障处理过程: 设备raid5组损坏两块硬,并raid组处理离线状态,情况如图:     由于硬盘数据比较重要,面对此情况不要慌我们尽量做到安全保守的保证数据尽可能完整,以下为处理方法,(遇raid5两块盘出现问题处理方法)   以下截图均为遇相同问题的解决图案,并非现场截图。 Ctrl+H 进WebBios界面,发现两...

chen_lipeng的博客 2万+

为什么要学习数据结构与算法javascript描述

在过去的几年中,得益于Node.js和SpiderMonkey这样的平台,JavaScript越来越多地被用于服务器端编程。鉴于JavaScript语言已经走出了浏览器,程序员发现他们需要更多传统语言,比如C++和Java提供的工具。这些工具包括经典的数据结构,如链表、栈、队列、图等,也包括经典的排序和查找算法。本书即讨论了在使用JavaScript进行服务器端编程时,如何实现这些经典的数据结构和

多多 2594

Context Capture10.20 安装教程(附安装包)

ContextCapture 是一款由Bentley公司推出的实景建模软件,可以快速为各种类型的基础设施项目生成最具挑战性的反应现实环境的三维模型。

一起来交流学习吧 2万+

【IPAM】Netbox docker模式版本升级

NETBOX 是一个开源的网络资源管理系统,主要用于管理 IP 地址、机架、设备、接口等网络资源信息。下面是 NETBOX 的功能、优点和缺点的详细介绍。

u012153104的博客 1330

手把手5分钟掌握JavaScript栈数据结构(一)【JavaScript数据结构与算法系列】

本文目录一、JavaScript栈数据结构二、一个基于数组的栈①创建一个基于数组的栈②向栈添加元素③从栈移除元素④查看栈顶元素⑤检查栈是否为空⑥清空栈元素三、使用Stack类四、本章小结五、写在后面 一、JavaScript栈数据结构 JavaScript中本无“栈”的这种类型,但是我们有时候又需要用到这类的数据结构,还记得上一篇文章提到的数组吗?JavaScript中的栈数据结构就是基于Array类型来进行封装的。让我们拭目以待吧! 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保

狼丶宇先森的网络科技空间 3396

(遇到问题)(已解决)word敲入的公式转化为mathtype

https://www.mathtype.cn/wenti/wordgongshi-zhuanhuan.html 现在越来越多的人在文档中编辑公式的时候会选择MathType来编辑,因为它包含有众多的数学符号和模板,编辑公式时非常方便。但是也有一些人在编辑公式时没有使用MathType公式编辑器,直接使用Word中自带的公式编辑器来编辑的。当我们需要要共享一份文件的时候,这种用自带公式编辑器编辑出来的文件,在我们安装有MathType公式编辑器的电脑里打开时,双击公式没有反应,是无法对它们进行修改的.

计算机视觉 1万+

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

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

老马的程序人生 4380

基于DRU-HVDC的构网型海上风电场环流机理仿真复现

本文介绍了基于DRU-HVDC的构网型海上风电场环流机理仿真模型的构建方法。主要内容包括: 完整的Simulink模型结构,包含主模型文件GFM_DRU_Main.slx和配置脚本GFM_DRU_Setup.m 系统参数设置,包括基础频率(20Hz)、电压基准值(690V)、功率基准值(2MVA)等 四种仿真场景配置:电压不平衡、相位不平衡、阻抗不平衡和频率不平衡 风力发电机(WT)子系统的详细构建步骤,包含电压源、输出阻抗和测量模块 变压器和DRU整流器的参数设置 该模型可用于研究构网型风电场的环流机理。

huanghm88的专栏 262

【4. BSP开发指南 - [4.6. 安全启动使用说明]】

【4. BSP开发指南 - [4.6. 安全启动使用说明]】

Sugar_wolf的博客 276

js数据结构与算法:栈

目录💫.认识栈🍔.面向过程方法源码编写栈2.1思考2.2需要实现的方法2.3源码实现,并调用类 🧣.用面向对象的方法来源码书写3.1思考3.2需要实现的方法3.3源码及使用类 🥩​​​​​​​.总结在实现之前我们思考一下我们怎么实现首先我们借用数组的方法来实现,所以我们需要创建一个空数组来模拟栈 运行结果:那么在实现这个类,我们用对象来模拟栈 4.总结 了解了面向对象与面向过程 掌握了两种方式用什么来模拟栈 对栈模拟进行源码设计............

m0_51311990的博客 2333

SAP Build Work Zone standard edition 订阅报错 OIDC trust missing 的成因与完整解决路径

摘要:用户订阅SAP Build Work Zone时遇到422错误,提示未配置OpenID Connect信任。该错误表明业务用户需通过SAP Cloud Identity Services的OIDC协议认证,而当前子账户仅配置了SAML信任或未配置信任。解决方法是进入子账户的Trust Configuration页面,使用Establish Trust功能建立与SAP Cloud Identity Services的OIDC信任关系。这是SAP新版服务的强制要求,SAML协议已不被支持。

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

「数据结构与算法Javascript描述」栈

「数据结构与算法Javascript描述」栈「数据结构与算法Javascript描述」栈1. 对栈的操作2. 栈的实现3. 使用Stack类3.1 数制间的相互转换3.2 回文3.3 递归演示 「数据结构与算法Javascript描述」栈 1. 对栈的操作 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。咖啡厅内的一摞盘子是现实世界中常见的栈的例子。只能从最上面取盘子,盘子洗净后,也只能摞在这一摞盘子的最上面。栈被称为一种后入先出(LIFO,last-in-fifirst-out)的数

p1967914901的博客 271

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINCC7.3破解文件

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

数据结构与算法JS描述之栈和队列

数据结构与算法JS描述之栈和队列 参考资料 数据结构与算法JS描述,[美] Michael McMillan 著,王群锋 杜欢 译 写在前面 写该系列的博客,初衷是帮助自己和初学者,奠定更高层次的编程基础和理念,能让大家对 JS 有更深层次的认知,并且借助 JS 了解高级的编程思想。 所有对于某个数据结构的算法的示范,并不是标准答案,只是我根据经验模仿了各种资料和其他成熟语言中的写法,如果有写的不精致的地方,或者更好的写法,联系我,我加以改正。 本来想用构造函数的形式实现这些数据结构,但是既然技术在更新,用

锋利的二丫 321

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Javascript描述-数据结构与算法

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

weixin_43689100的博客 402

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

javascript数据结构与算法

数据结构:数据的组织形式,如数组、链表、树、图等,用于高效存储和访问数据 算法:解决问题的步骤,是指令的有限序列,其中每条指令表示一个或多个操作。它具备有穷性(有限步骤内完成)、确定性(每一步都有确切含义)、可行性(能通过有限次操作实现)等基本特性 数据结构为算法提供了操作的对象和基础,而算法则通过操作这些数据结构中的数据来实现特定的功能和性能要求

Hi_MrXiao的博客 1286

《数据结构与算法JavaScript描述》读书笔记

总的来说,书的质量不太高,如果作为前端工程师算法入门的书的话,不如去读《算法图解》,相比之下更容易理解,讲解也更加准确。这本JavaScript描述只是用了JavaScript去实现一些基础算法,而且实现的也不是很令人满意。

多啦的博客 512

JavaScript 版数据结构与算法

数据结构与算法

weixin_49809163的博客 1406

JS Raccoon:前端面试必刷的12个JavaScript算法练习

在竞争激烈的前端面试中,扎实的算法基础是脱颖而出的关键。JS Raccoon项目提供了一系列精选的JavaScript算法练习,帮助开发者提升编程能力和问题解决技巧。本文将介绍12个前端面试高频算法题,涵盖字符串处理、数据结构、逻辑思维等核心知识点,适合新手和普通用户系统学习。 ## 为什么选择JS Raccoon算法练习? JS Raccoon的算法练习具有以下特点: - **贴近实战**:

gitblog_00851的博客 1046

02【JS数据结构与算法】栈

写在前面 上一节我们介绍了JS中的第一个数据结构——数组,包括它里面的一些自带的方法、还有我们自己手动实现的方法、还有使用场景等。JS中的数组跟其他语言不太一样,它是动态增长的,所以它给我们编程带来了极大的灵活性。今天我们再来介绍另一种数据结构——栈,它其实可以看作是JS中的一种特殊的数组。 接下来的内容,我们按下图所示给大家介绍: 栈的描述 栈的功能其实跟数组类似,就是用来存储一些数据的,不过它跟数组不同的是:栈是一种后进先出(LIFO)的数据结构。怎么理解呢?就像是现实生活中我们在桌子上摞的

X北辰北的博客 712

JavaScript版数据结构与算法(一)栈、队列、链表、集合、树

为什么要学习数据结构与算法?最重要的就是面试要考算法,另外就是如果在实际工作当中,能够使用算法优化代码,会提升代码质量和运行效率,作为一名前端人员可能在实际中用的并不是特别多。数据结构与算法是分不开的,数据结构是,算法是,程序就是。算法刷题大家都知道,就是力扣。刷题顺序推荐按类型刷题,比如栈相关的题,一次刷好几道,巩固巩固。刷题过程中需要重点关注的是。其实这跟高中初中做数学题很像,有通用的套路可循,但是需要多复习,多看错题,做题的时候尽量把这道题考察的知识点都总结出来。

weixin_45855469的博客 1413

重读《学习JavaScript数据结构与算法-第三版》- 第4章 栈

定场诗 金山竹影几千秋,云索高飞水自流; 万里长江飘玉带,一轮银月滚金球。 远自湖北三千里,近到江南十六州; 美景一时观不透,天缘有分画中游。 前言 本章是重读《学习JavaScript数据结构与算法-第三版》的系列文章,本章为各位小伙伴分享数据结构-栈的故事,请让胡哥带你走进栈的世界 栈 何为栈?栈是一种遵从后进先出(LIFO)原则的有序集合。 新添...

胡哥有话说 441

数据结构与算法Javascript描述(一)栈

栈的特点: 后入先出。 Stack类: function Stack() { this.dataSource = []; this.top = 0; this.push = push; this.pop = pop; this.peek = peek; this.clear = clear; this.length = length

Preserve 627
上一篇: 数据结构与算法JavaScript描述练习------第3章列表
下一篇: 数据结构与算法JavaScript描述练习------第5章队列
maxiumII
博客等级 码龄17年 436粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值