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

news2024/10/11 17:22:24

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

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

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

相关文章

图像处理(二)——MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Computer Vision and Image Processing, 2nd Edition 截止时间&#xff1a; 投稿截止日期&#xff1a;2024年12月31日 目标及范围&#xff1a; 感兴趣的主题包括但不限于&#xff1a; 用于图像分类和识别的深度学习 对象检测和跟…

EdgeNAT: 高效边缘检测的 Transformer

EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b):来自BSDS500的数据集的输入图像。(c, d):对应的真实标签。(e, f):由EdgeNAT检测到的边缘。(e)显示了由于颜色变化…

QT元对象系统特性详细介绍(信号槽、类型信息、动态设置属性)(注释)

目 录 一、元对象系统简介 二、信号和槽 三、类型信息 四、动态设置属性 一、元对象系统简介 QT中的元对象系统Q_OBJECT并不是C标准代码&#xff0c;因此在使用时需要QT的MOC&#xff08;元对象编译器&#xff09;进行预处理&#xff0c;MOC会在编译时期读取C代码中的特定…

暗语源码 复现佛禅翻译系统v2升级版源码

与佛论禅翻译系统 一个翻译佛论的娱乐系统&#xff0c;类似于核心价值观加密 此为升级版&#xff0c;每次加密得到的结果不一样&#xff0c;配合箴言功能&#xff0c;更加安全 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89874751 更多资源下载&a…

现代易货交易:重塑价值,引领未来交易新风尚

在当今经济蓬勃发展的背景下&#xff0c;一种新颖的交易模式——现代易货交易&#xff0c;正逐渐崭露头角并赢得市场的认可。这一模式不仅对传统物品交换方式进行了革新&#xff0c;更在物品价值的评估与交换手段上展现出创新性。那么&#xff0c;现代易货交易究竟是何方神圣&a…

基于SSM的旅游网站【附源码】

基于SSM的旅游网站&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1 管理员功能介绍 5.1.1 用户管理 5.1.2 …

比较模拟数据

模拟数据检查器可以比较来自工作区、文件或模拟中的运行和单个信号的数据和元数据。可以使用公差来分析比较结果&#xff0c;并可以通过指定信号属性和比较约束来配置比较行为。此示例使用从模型slexAircraftExample的模拟中记录的数据&#xff0c;演示了以下内容&#xff1a; …

云栖实录 | MaxCompute 迈向下一代的智能云数仓

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 张治国 | 阿里云智能集团研究员、阿里云 MaxCompute 负责人 谢德军&#xff5c;阿里云智能集团资深技术专家 于得水&#xff5c;阿里云智能集团资深技术专家 谌鹏飞&#xff5c…

SpringMVC源码-@ControllerAdvice和 @InitBinder注解源码讲解

1.ControllerAdvice修饰的类何时被加载扫描 被ControllerAdvice修饰的类是作用于全局的 initStrategies 初始化springmvc的9大组件 initStrategies:531, DispatcherServlet (org.springframework.web.servlet) onRefresh:514, DispatcherServlet (org.springframework.web.se…

在线答题系统怎么做?一文为您揭秘!

在线答题系统是一种利用网络技术实现的答题平台&#xff0c;具有高效、便捷、灵活等特点&#xff0c;被广泛应用于教育、培训、考试、竞赛等场景。以下是其详细介绍&#xff1a; 一、 基本功能&#xff1a; 题目录入&#xff1a;支持多种方式录入题目&#xff0c;如手动输入、…

Android15之解决:Dex checksum does not match for dex:services.jar问题(二百三十五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

前端接收到的日期格式为 2021-12-07T16:44:53.298+00:00 怎么办?

在写项目的时候&#xff0c;给前端发送了一个 Date 类型的数据,发现格式不对&#xff1a; 可以通过在application 配置文件中进行如下配置&#xff1a; spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8 前端在获取就发现格式正确

登高赏菊迎重阳,与家人共乐同度佳节。

在金风送爽的重阳佳节&#xff0c;让我们登高远望&#xff0c;与亲人共赏菊花&#xff0c;共享团圆时光。愿清风明月&#xff0c;带来幸福与好运&#xff0c;让我们心怀感恩&#xff0c;笑对人生&#xff0c;共度这个美好的重阳节日&#xff01;

中安未来 OCR:合同抽取的高效利器

在数字化办公的时代&#xff0c;高效处理文档成为了众多企业的迫切需求。中安未来 OCR 技术以其强大的功能脱颖而出。 中安未来的 OCR 技术能够准确识别各种文档中的文字信息&#xff0c;其中合同抽取功能尤为实用。对于企业来说&#xff0c;合同管理至关重要。传统的合同处理方…

如何设置 GitLab 密码过期时间?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 60天专业…

CLIP——多模态预训练模型介绍

CLIP: Contrastive Language-Image Pre-training CLIP: 对比语言-图像预训练 CLIP的是由 OpenAI 2021年在 Learning Transferable Visual Models From Natural Language Supervision【利用文本的监督信号训练一个迁移能力强的视觉模型】中提出的一种多模态预训练模型&#xff…

AI荣耀时刻!2024诺贝尔物理奖、化学奖双双归属AI界

全球科学界迎来了2024最为瞩目的时刻——诺贝尔奖揭晓&#xff01;当诺贝尔物理奖和化学奖这两大科学殿堂的最高荣誉同时聚焦在人工智能&#xff08;AI&#xff09;领域时&#xff0c;AI技术无疑再次被推向了神坛&#xff0c;成为全球瞩目的焦点&#xff01;这一历史性的时刻&a…

2024年【焊工(初级)】最新解析及焊工(初级)模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;最新解析根据新焊工&#xff08;初级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将焊工&#xff08;初级&#xff09;模拟考试试题进行汇编&#xff0c;组成一套焊…

来势汹汹,Eva Gamaiun超现实版权画时隔一年连发两案再次维权

案件基本情况起诉时间&#xff1a;2024-9-23、2024-9-24案件号&#xff1a;2024-cv-08763、2024-cv-08804原告&#xff1a;Eva Gamaiun原告律所&#xff1a;keith起诉地&#xff1a;伊利诺伊州北部法院品牌介绍Eva Gamayun&#xff0c;1990年出生&#xff0c;是一位自学成才的混…

vue项目 子组件在打开时调用父组件传过来的props里的数据

1 分析: 父组件在加载时就会加载子组件,所以此时调不到数据, 我们可以利用父组件内子组件的ref属性,获取子组件的方法, 在父组件的触发方法中调用直接传值 例: 父组件: //父组件事件AttributesRelations(row){this.dialogForm rowthis.$refs.AttributesRelationsRef.Attribu…