前端面试题55(JavaScript前缀中缀后缀表达式)

news2024/9/25 5:24:20

在这里插入图片描述
在编程中,前缀、中缀和后缀表达式是用于描述算术表达式的不同表示方法,主要用于解析和计算数学公式。这些概念在算法设计(尤其是表达式树和栈的应用)中非常重要。下面我将分别解释这三种表达式,并用JavaScript代码示例来说明如何转换和计算它们。

1. 中缀表达式 (Infix Expression)

这是最常见的表达式形式,我们在日常书写数学公式时使用的就是中缀表达式。例如,(3 + 4) * 2。在这种表示法中,操作符位于其操作数之间。

2. 前缀表达式 (Prefix Expression)

也称为波兰表示法(Polish Notation),在这种表示法中,操作符位于其操作数之前。上述中缀表达式对应的前缀表达式为 * + 3 4 2

3. 后缀表达式 (Postfix Expression)

又称逆波兰表示法(Reverse Polish Notation, RPN),操作符位于其操作数之后。同样的例子,后缀表达式为 3 4 + 2 *

JavaScript 示例代码

计算后缀表达式

计算后缀表达式相对直接,可以利用栈的数据结构来实现。

function evaluatePostfix(expr) {
    let stack = [];
    for(let char of expr.split(' ')) {
        if(!isNaN(char)) { // 如果是数字,则入栈
            stack.push(Number(char));
        } else { // 如果是操作符,则出栈两个元素进行运算,然后结果入栈
            let b = stack.pop();
            let a = stack.pop();
            switch(char) {
                case '+': stack.push(a + b); break;
                case '-': stack.push(a - b); break;
                case '*': stack.push(a * b); break;
                case '/': stack.push(a / b); break;
            }
        }
    }
    return stack.pop(); // 最终栈内只剩一个元素,即为计算结果
}

// 示例
let postfixExpr = "3 4 + 2 *";
console.log(evaluatePostfix(postfixExpr)); // 输出结果应为 14
中缀转后缀表达式

转换中缀表达式为后缀表达式稍微复杂一些,同样需要用到栈。

function infixToPostfix(infix) {
    let prec = { // 定义操作符优先级
        '+': 1, '-': 1,
        '*': 2, '/': 2,
        '^': 3
    };
    let opStack = [], postfix = [];
    infix = infix.replace(/\s+/g, '').split('');
    
    for(let char of infix) {
        if(!isNaN(char)) { // 数字直接加入输出
            postfix.push(char);
        } else if(char === '(') { // 左括号入栈
            opStack.push(char);
        } else if(char === ')') { // 遇到右括号,弹出并输出直到遇到左括号
            while(opStack[opStack.length - 1] !== '(') {
                postfix.push(opStack.pop());
            }
            opStack.pop(); // 弹出左括号
        } else if(prec[char]) { // 遇到操作符
            while(opStack.length && prec[opStack[opStack.length - 1]] >= prec[char]) {
                postfix.push(opStack.pop());
            }
            opStack.push(char);
        }
    }
    
    while(opStack.length) { // 处理剩余的操作符
        postfix.push(opStack.pop());
    }
    
    return postfix.join(' ');
}

// 示例
let infixExpr = "( 3 + 4 ) * 2";
console.log(infixToPostfix(infixExpr)); // 输出 "3 4 + 2 *"

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

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

相关文章

html网页设计关于家乡-泰州

代码地址:https://pan.quark.cn/s/0f8659c712d0

逻辑运算及其基本概念,定理,算法,规律,卡诺图

逻辑运算及其基本概念,定理,算法,规律,卡诺图 文章目录 逻辑运算及其基本概念,定理,算法,规律,卡诺图开胃小菜运算1、与运算2、或运算3、非运算4、与非(都1时为0&#xf…

解决GET请求中文乱码问题

解决GET请求中文乱码问题 1、乱码的根本原因2、解决方法方法一:修改Tomcat配置(推荐)方法二:使用URLEncoder和URLDecoder(不推荐用于GET请求乱码)方法三:String类编解码(不直接解决乱…

Qt中实现让静态图片动起来,创建动画效果

在现代应用程序开发中,动画效果是提升用户体验的重要元素之一。Qt作为一个强大的跨平台应用程序框架,提供了丰富的工具和库来创建各种动画效果。本文将介绍如何在Qt中使用静态图片创建动画效果。 实现方法一 使用QTimer和QPixmap 1.准备图片资源&#…

【初阶数据结构】2.顺序表

文章目录 1.线性表2.顺序表2.1 概念与结构2.2 分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现2.4 顺序表算法题2.4.1 移除元素2.4.2 删除有序数组中的重复项2.4.3 合并两个有序数组 2.5 顺序表问题与思考 1.线性表 线性表(linear list)是n…

【Python】Python Flask 和 gRPC 简单项目

Python Flask 和 gRPC 示例项目 本文将介绍如何在 Python 中使用 Flask 和 gRPC 创建一个简单的示例应用程序,并使用 requests 库进行测试。 环境设置 首先,确保您已经安装了 Python。然后,创建一个虚拟环境以管理您的依赖项。 python -m…

想要爬取第一条网页的数据但是失败了?如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

使用Python的Turtle模块绘制玫瑰

在本文中,我们将通过使用Python中的turtle模块来绘制一个精美的花朵图案,包括花蕊、花瓣和叶子。turtle模块是Python标准库的一部分,用于创建图形和动画,非常适合初学者学习编程基础和图形绘制。 初始设置 import turtle# 设置初…

简介Docker以及K8s

什么是Docker Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口以及操作系统级别的虚拟化。 更为直白的叙述就是,Docker可以将程序和环境(依赖库配置操作系统)打包并运行的工具软件。 基础镜像 总所周知&#xf…

搜维尔科技:《Patchwork 3D 2024》现已推出,改善用户体验的同时添加了最受欢迎的功能

《Patchwork 3D 2024》现已推出!发现我们在改善用户体验的同时添加的最受欢迎的功能。 令人兴奋的消息值得分享!Patchwork 3D 已经升级,并带来一些令人惊叹的新功能。 材料 镜面材质现在支持漫反射、镜面反射和凹凸特性,可实现精细调整的光…

防火墙安全策略练习

目录 实验拓扑 实验要求 实验思路 实验步骤 1.配置交换机,划分接口的vlan,配置ISP 2.配置防火墙 3.接下来在WEB界面进行所有安全策略操作 配置接口 创建安全区域: 创建地址: 时间段: 安全策略部分&#xff…

Java 常用的参数校验,简化参数校验,赶紧学起来!!

Java 常用的参数校验,简化参数校验,赶紧学起来!!Java中的参数校验注解主要用于简化数据验证的过程,它们允许开发者以声明式的方式指定参数的验证规则,而无需在业https://mp.weixin.qq.com/s?__bizMzkzMTY0…

LLM-向量数据库中的索引算法总结

文章目录 前言向量数据库介绍索引方法倒排索引KNN 搜索近似 KNN 搜索Product Quantization(PQ)NSW 算法搜索HNSW 前言 向量数据库是当今大模型知识库检索落地实践的核心组件,下图是构建知识库检索的架构图: 首先会将相关文档数据向量化嵌入到向量化数据…

视图库对接系列(GA-T 1400)十六、视图库对接系列(本级)通知(订阅回调)

说明 之前我们实现了订阅接口,其中有一个receiveAddr参数, 这个就是对应的回调的地址。一般情况下对应的是同一个服务。 我们推荐使用http://xxx:xxx/VIID/SubscribeNotifications接口文档 SubscribeNotificationList对象对象如下: 文档中是xml,但实际上目前使用的都是jso…

在 PostgreSQL 里如何处理数据的归档和清理策略的优化?

文章目录 在 PostgreSQL 中处理数据归档和清理策略的优化一、理解数据归档和清理的重要性二、确定归档和清理的标准三、PostgreSQL 中的数据归档方法(一)使用分区表(二)导出数据 四、PostgreSQL 中的数据清理方法(一&a…

操作系统——内存管理(面试准备)

虚拟内存 单片机没有操作系统,每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来。 另外,单片机的CPU是直接操作内存的物理地址。 在这种情况下,想在内存中同时运行两个程序是不可能的,如果第…

JavaFx+MySql学生管理系统

前言: 上个月学习了javafx和mysql数据库,于是写了一个学生管理系统,因为上个月在复习并且有一些事情,比较忙,所以没有更新博客了,这个项目页面虽然看着有点简陋了,但是大致内容还是比较简单的,于是现在跟大家分享一下我的学生管理系统,希望对这方面有兴趣的同学提供一些帮助 &a…

浪潮服务器内存物理插槽位置

浪潮服务器内存物理插槽位置 如下图所示

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac AnyGo for Mac是一款专为Mac电脑用户设计的虚拟定位工具。它可以模拟你的GPS位置,让你的设备显示你在任何世界上的任何地方。无论你是想在游戏中虚拟移动,还是在社交媒体上分享虚拟的旅行照片&#xff0…

基于SpringBoot+MySQL的租房项目+文档

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…