当前位置: 首页 > news >正文

中缀表达式 - 栈实现综合计算器

代码: 

package Algotithm.stackobject Calculator {def main(args: Array[String]): Unit = {val expression = "3+2*6-2"//创建两个栈:数栈、符号栈val numStack, operStack = new ArrayStack2(10)//定义需要的相关变量var index, num1, num2, oper, res = 0 //用于扫描var ch: Char = ' ' //每次扫描得到的char保存到chvar keepNum: String = ""//开始循环扫描入栈while (index < expression.length) {ch = expression.charAt(index)//判断是什么if (operStack.isOper(ch)) {if (operStack.isEmpty) {//如果为空直接入栈operStack.push(ch)} else {//如果不为空if (operStack.priority(ch) <= operStack.priority(operStack.peek())) {//从数栈中pop出两个数进行运算num1 = numStack.pop()num2 = numStack.pop()oper = operStack.pop()res = numStack.cal(num1, num2, oper)//把运算结果入数栈numStack.push(res)//当前符号入符号栈operStack.push(ch)} else {operStack.push(ch)}}} else {//如果是数,则直接入数栈//numStack.push(ch - 48)//1.当处理多位数时,不能发现一个数就立即入栈。因为也可能是多位数//2.在处理数时,需要像exp表达式后再看一位。如果是数就继续扫描。如果是符号再入栈//3.定义一个字符串变量,用于拼接//处理多位数keepNum += ch//如果ch已经是exp的最后一位,就直接入栈if (index == expression.length - 1) {numStack.push(keepNum.toInt)} else {//判断下一个字符是不是数字。如果是数字,就继续扫描。如果是运算符,则入栈if (operStack.isOper(expression.charAt(index + 1))) {//如果后一位时运算符,则入栈numStack.push(keepNum.toInt)//keepnum清空keepNum = ""}}}index = index + 1}while (!operStack.isEmpty) {//如果符号栈为空,则计算到最后的结果,数栈中只有一个数字num1 = numStack.pop()num2 = numStack.pop()oper = operStack.pop()res = operStack.cal(num1, num2, oper)numStack.push(res) //入栈}println(s"表达式 $expression = ${numStack.pop()}")}
}//先创建一个栈
class ArrayStack2 {private var maxSize: Int = _private var stack: Array[Int] = _private var top = -1//构造器def this(maxSize: Int) {thisthis.maxSize = maxSizestack = new Array[Int](this.maxSize)}//栈满def isFull: Boolean = {top == maxSize - 1}//栈空def isEmpty: Boolean = {top == -1}//返回当前栈顶的值def peek(): Int = {stack(top)}//入栈-pushdef push(value: Int): Unit = {if (isFull) {println(s"栈满")return}top = top + 1stack(top) = value}//出栈-popdef pop(): Int = {if (isEmpty) {throw new RuntimeException(s"栈空,没有数据")}val value = stack(top)top = top - 1value}//显示栈的情况【遍历栈】def list: Unit = {if (isEmpty) {println(s"栈空,没有数据")return}//需要从栈顶开始显示for (i <- 0 to top) {println(s"stack=${stack(top - i)}")}}//返回运算符的优先级,优先级为自定义//优先级使用数字表示。数字越大,优先级越高def priority(oper: Int): Int = {val ret = oper match {case '*' | '/' => 1case '+' | '-' => 0case _ => -1}ret}//判断是不是一个运算符def isOper(value: Char): Boolean = {value.equals('+') ||value.equals('-') ||value.equals('*') ||value.equals('/')}//计算方法def cal(num1: Int, num2: Int, oper: Int): Int = {var res: Int = 0 //用于存放计算的结果res = oper match {case '+' => num1 + num2case '-' => num2 - num1case '*' => num1 * num2case '/' => num2 / num1}res}}

总结:

Scala在模式匹配+偏函数的结合应用其灵活度太高了,,用顺手了习惯了之后会比Java简化很多。变量声明时也不用像Java一样一个变量new一次对象,可以像下面这样:

 

相关文章:

中缀表达式 - 栈实现综合计算器

代码&#xff1a; package Algotithm.stackobject Calculator {def main(args: Array[String]): Unit {val expression "32*6-2"//创建两个栈&#xff1a;数栈、符号栈val numStack, operStack new ArrayStack2(10)//定义需要的相关变量var index, num1, num2, …...

html语音播报功能问题

语音播报有个问题&#xff0c;就是弹出层有时无法关闭页面的播报&#xff0c;如果弹出层也有语音播报&#xff0c;就会造成语音混者播放 解决办法就是在弹出窗口(我用的弹出层框架是layui的)之前清空语音 window.operEdit function (url, title){window.speechSynthesis.can…...

计算机重点学科评级B-,山东省属重点高校考情分析

山东科技大学(B-) 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1175字预计阅读&#xff1a;3分钟 2023考情概况 山东科技大学计…...

轻松搭建本地知识库的ChatGLM2-6B

近期发现了一个项目&#xff0c;它的前身是ChatGLM&#xff0c;在我之前的博客中有关于ChatGLM的部署过程&#xff0c;本项目在前者基础上进行了优化&#xff0c;可以基于当前主流的LLM模型和庞大的知识库&#xff0c;实现本地部署自己的ChatGPT&#xff0c;并可结合自己的知识…...

flink的物理DataFlow图及Slot处理槽任务分配

背景 在flink中&#xff0c;有几个比较重要的概念&#xff0c;逻辑DataFlow图&#xff0c;物理DataFlow图以及处理槽执行任务&#xff0c;本文就来讲解下这几个概念 概念详解 假设有以下代码&#xff1a;数据源和统计单词算子的并行度是2&#xff0c;数据汇算子的并行度是1&…...

与面试相关的redis

这里写自定义目录标题 &#x1f4dd; redis的知识点数据结构及其特性&#xff0c;用途和操作方法持久化高可用分布式锁发布订阅性能优化安全性数据分片缓存策略键过期删除策略内存淘汰策略 &#x1f917; 总结归纳&#x1f4ce; 参考文章 &#x1f600; 这里写文章的前言&#…...

MapStruct从0到0.5

MapStruct从0到0.5 开发的过程&#xff0c;经常会用到实体类属性映射&#xff0c;同时为了方便&#xff0c;开发者也很少自己写专门的属性赋值工具类。索性会直接使用Sprrng提供的BeanUtils工具类&#xff0c;然后在性能上和字段属性赋值上的问题&#xff0c;一直是为开发者所…...

STM32H750 HAL CUBEMX 时钟失败及死机无法下载问题解决

芯片采样电压设置&#xff0c;否则 无法运行 解决死机问题 设置swd 模式 短接 boot0 —vcc 3.3v即可正常下载...

paddlespeech on centos7

概述 paddlespeech是百度飞桨平台的开源工具包&#xff0c;主要用于语音和音频的分析处理&#xff0c;其中包含多个可选模型&#xff0c;提供语音识别、语音合成、说话人验证、关键词识别、音频分类和语音翻译等功能。 paddlespeech整体是比较简单易用的&#xff0c;但是安装…...

ROM是什么? 刷ROM是什么意思?

文章目录 ROM是什么&#xff1f;刷ROM是什么意思 ROM是什么&#xff1f; ROM是只读内存&#xff08;Read-Only Memory&#xff09;的简称&#xff0c;是一种只能读出事先所存数据的固态半导体存储器。其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的…...

华为云Stack的学习(五)

六、华为云stack服务简介 1.云服务在华为云Stack中的位置 云服务对接多个数据中心资源池层提供的资源&#xff0c;并向各种行业应用提供载体。 2.华为云Stack通用服务 2.1 云计算的服务模式 2.2 计算相关的云服务 2.3 存储相关的云服务 2.4 网络相关的云服务 3.云化案例 **…...

【LeetCode-中等题】904. 水果成篮

文章目录 题目方法一&#xff1a;滑动窗口方法二&#xff1a; 题目 题目的意思就是&#xff1a;找至多包含两种元素的最长子串&#xff0c;返回其长度 方法一&#xff1a;滑动窗口 class Solution { // 滑动窗口 找至多包含两种元素的最长子串&#xff0c;返回其长度public …...

【C++】哈希——哈希的概念,应用以及闭散列和哈希桶的模拟实现

前言&#xff1a; 前面我们一同学习了二叉搜索树&#xff0c;以及特殊版本的平衡二叉搜索树&#xff0c;这些容器让我们查找数据的效率提高到了O(log^2 N)。虽然效率提高了很多&#xff0c;但是有没有一种理想的方法使得我们能提高到O(1)呢&#xff1f;其实在C语言数据结构中&a…...

Kubernetes (K8s) 解读:微服务与容器编排的未来

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…...

JavaScript学习--Day04

元字符 边界符&#xff1a; /^/&#xff1a;以什么开头 /$/&#xff1a;以什么结尾 量词&#xff1a; 预定义类&#xff1a;...

HCS 基本概念(三)

一、定义 HCS采用FusionSphere OpenStack作为云平台&#xff0c;对各个物理数据中心资源做整合&#xff0c;采用ManageOne作为数据中心管理软件对多个数据中心提供统一管理&#xff0c;通过云平台和数据中心管理软件协同运作&#xff0c;达到多数据中心融合、提升企业整体IT效率…...

通过curl命令分析http接口请求各阶段的耗时等

目录 一、介绍二、功能1、-v 输出请求 响应头状态码 响应文本等信息2、-x 测试代理ip是否能在该网站使用3、-w 额外输出查看接口请求响应的消耗时间4、-o 将响应结果存储到文件里面5、-X post请求测试 (没测成功用的不多) 一、介绍 Curl是一个用于发送和接收请求的命令行工具和…...

Linux工具——gcc

目录 一&#xff0c;gcc简介 二&#xff0c;C语言源文件的编译过程 1.预处理 2.编译 3.汇编 4.链接 5.动静态库 一&#xff0c;gcc简介 相信有不少的小白和我一样在学习Linux之前只听说过visual studio。其实这个gcc这个编译器实现的功能便是和visual studio一样的功能&…...

uni-app 使用uCharts-进行图表展示(折线图带单位)

前言 在uni-app经常是需要进行数据展示&#xff0c;针对这个情况也是有人开发好了第三方包&#xff0c;来兼容不同平台展示 uCharts和pc端的Echarts使用差不多&#xff0c;甚至会感觉在uni-app使用uCharts更轻便&#xff0c;更舒服 但是这个第三方包有优点就会有缺点&#xf…...

180B参数的Falcon登顶Hugging Face,vs chatGPT 最好开源大模型使用体验

文章目录 使用地址使用体验test1:简单喜好类问题test2:知识性问题test3:开放性问题test4:中文支持test5:问题时效性test6:学术问题使用地址 https://huggingface.co/spaces/tiiuae/falcon-180b-demo 使用体验 相比Falcon-7b,Falcon-180b拥有1800亿的参数量...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...