数据结构-栈和队列刷题集(长期更新)

文章目录

      • 万能计算器的实现以及源码分析
      • 1. leetcode 150 逆波兰表达式求值

万能计算器的实现以及源码分析

/*** 我们尝试写一个完整版的计算器,由于计算机不能很好的识别括号,所以一般要转换为逆波兰表达式求解* 思路解析 :* 1. 输入一个 中缀表达式* 2. 中缀表达式转化为list存储* 3. 把list转换为一个逆波兰表达式*      规则如下 首先准备两个栈,stack1 , list2(stack2)*      如果是数字直接装入 list2*      如果是括号 分为左括号跟右括号*         如果是左括号直接进入stack1*         如果是右括号 stack1 弹栈 ,弹出的元素进入stack2,直到出现 ')' ,抵消掉一个右括号*      如果是操作符*          如果stack1 为空 或者是 栈顶为左括号,那么直接入栈          <---------------------------*          如果操作符的优先级大于 栈顶 操作符的优先级,直接入栈                                    **          如果操作符的优先级小于等于 栈顶操作符 ,那么就弹出栈顶元素入stack2,然后进入第一条比较 --------** 4. 利用逆波兰表达式进行求值*/
class MyCalculator{public static void main(String[] args) {String s = "1+ ((2 +3) *4 )-5";List<String> infixexperssion = toList(s);List<String> suffixexpression = toSuffixexpression(infixexperssion);int ret = calculate(suffixexpression);System.out.println(ret);}/*** 该方法的作用就是把一个字符串转换为一个中缀表达式的list* @param infixexpression : 中缀表达式* @return*/public static List<String> toList(String infixexpression){List<String> ret = new ArrayList<>();int count = 0;while(count < infixexpression.length()){if(infixexpression.charAt(count) == ' '){count++;continue;}if(infixexpression.charAt(count) < '0' || infixexpression.charAt(count) > '9'&& infixexpression.charAt(count)!=' '){ret.add(infixexpression.charAt(count) + "");count++;}else{StringBuilder stringBuilder = new StringBuilder();while(count < infixexpression.length() && infixexpression.charAt(count)>='0'&& infixexpression.charAt(count)<='9'){stringBuilder.append(infixexpression.charAt(count));count++;}ret.add(stringBuilder.toString());}}return ret;}/*** 该方法的作用是将我们的中缀表达式转化为逆波兰表达式* @param infixexpression : 传入的中缀表达式* @return*/public static List<String> toSuffixexpression(List<String> infixexpression){//首先创建两个栈,因为第二个栈不涉及弹栈操作,所以我们可以创建为顺序表Stack<String> stack = new Stack<>();List<String> list = new ArrayList<>();for(String elem : infixexpression){if(elem.equals("(")){stack.push(elem);}else if(elem.equals(")")){while(stack.size() != 0 && !stack.peek().equals("(")){list.add(stack.pop());}stack.pop();}else if(isOperator(elem) ){if(stack.size() == 0 || stack.peek().equals("(") || priority(elem) > priority(stack.peek())){stack.push(elem);continue;}while(stack.size() != 0 && priority(elem) <= priority(stack.peek()) && !stack.peek().equals("(")){list.add(stack.pop());}stack.push(elem);}else{list.add(elem);}}while(stack.size() != 0){list.add(stack.pop());}return list;}//判断是否是操作符public static boolean isOperator(String elem){if(elem.equals("+")||elem.equals("-")||elem.equals("*")||elem.equals("/")){return true;}return false;}//判断优先级的大小public static int priority(String elem){if(elem.equals("+") || elem.equals("-")){return 1;}else{return 2;}}/*** 最后收一下尾巴,用我们所得到的逆波兰表达式求出值* 求值的基本思路应该比较好理解* 如果是数字直接入栈,如果不是,弹出两个数字,然后进行运算结果入栈*/public static int calculate(List<String> sufferixexperssion){Stack<String> stack = new Stack<>();for(String elem : sufferixexperssion){if(isOperator(elem)){int num2 = Integer.parseInt(stack.pop());int num1 = Integer.parseInt(stack.pop());switch (elem){case "+" :stack.push((num1+num2)+"");break;case "-" :stack.push((num1-num2)+"");break;case "*" :stack.push((num1*num2)+"");break;case "/" :stack.push((num1/num2)+"");break;}}else{stack.push(elem);}}return Integer.parseInt(stack.pop());}
}

1. leetcode 150 逆波兰表达式求值

逆波兰表达式又叫做后缀表达式,因为计算机是好辨认出中缀表达式的计算顺序的,所以有时候要用后缀表达式进行求解
题目描述
在这里插入图片描述
思路分析:
1.如果是数字,直接入栈
2.如果是操作符,弹出两个数字分别作为右操作数跟左操作数运算,结果入栈
3.最后弹出栈内的最后一个元素
代码实现如下

	public static int evalRPN(String[] tokens) {Stack<String> stack = new Stack<>();for (int i = 0; i < tokens.length; ++i) {String s = tokens[i];if (toolOperator(s)) {int num1 = Integer.parseInt(stack.pop());int num2 = Integer.parseInt(stack.pop());switch (s) {case "+":stack.push((num2 + num1) + "");break;case "-":stack.push((num2 - num1) + "");break;case "*":stack.push((num2 * num1) + "");break;case "/":stack.push((num2 / num1) + "");break;}} else {stack.push(s);}}return Integer.parseInt(stack.pop());}//判断是不是操作符public static boolean toolOperator(String s) {if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {return true;}return false;}

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

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

相关文章

SpringBoot基于RabbitMQ实现消息可靠性

文章目录 1. ☃️概述2. ☃️生产者消息确认2.1 ❄️❄️概述2.2 ❄️❄️实战⛷️⛷️⛷️2.2.1 修改配置⛷️⛷️⛷️2.2.2 定义 Return 回调⛷️⛷️⛷️2.2.3 定义ConfirmCallback 3. ☃️消息持久化3.1 ❄️❄️交换机持久化3.2 ❄️❄️队列持久化3.3 ❄️❄️消息持久化…

进程、线程和协程

进程、线程和协程 进程是程序的执行实例 线程是进程的执行路径 协程是基于线程之上但又比线程更加轻量级的存在 进程与线程的区别 线程是程序执行的最小单位&#xff0c;而进程是操作系统分配资源的最小单位 进程和程序的区别 程序&#xff1a;执行特定任务的一串代码&a…

牛客Linux高并发服务器开发学习第二天

Gcc编译 利用gcc 生成应用时如果不加-o 和应用名&#xff0c;默认生成a.out 可以用./ a.out打开 Gcc工作流程 可执行程序Windows系统中为.exe Linux系统中为.out g也可以编辑c程序 gcc也可以编译cpp代码&#xff0c;只是在编译阶段gcc不能自动共和C程序使用的库进行联接&…

JS-43-Node.js02-安装Node.js和npm

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;可以让JavaScript实现后端开发&#xff0c;所以&#xff0c;首先在本机安装Node.js环境。 一、安装Node.js 官网&#xff1a;下载 Node.js 默认两个版本的下载&#xff1a; 64位windows系统的LTS(Long Tim…

CST电磁仿真物体表面的Sheet结构和生成3D Model【基础教程】

由Sheet结构生成3D Model 使用Shell Solid and Thicken Sheet&#xff01; Modeling > Tools > Shape Tools > Shell Solid or Thicken Sheet Shell Solidor ThickenSheet会根据不同类型的模型提供两种完全不同的功能。 如033.由3D Model生成Cavity 所述&#xff…

飞行机器人专栏(十四)-- Kinect DK 人体骨骼点运动提取方法

系列文章目录 Ubuntu 18.04/20.04 CV环境配置&#xff08;下&#xff09;--手势识别TRTposeKinect DK人体骨骼识别_ubuntu kinect骨骼测试-CSDN博客文章浏览阅读1.3k次。trt_pose_ros kinect实现手势识别和人体骨骼识别&#xff0c;用于机器人运动控制参考_ubuntu kinect骨骼测…

Postgresql源码(126)TupleStore使用场景与原理分析

相关 《Postgresql源码&#xff08;125&#xff09;游标恢复执行的原理分析》 《Postgresql游标使用介绍&#xff08;cursor&#xff09;》 总结 开源PG中使用tuple store来缓存tuple集&#xff0c;默认使用work_mem空间存放&#xff0c;超过可以落盘。在PL的returns setof场景…

Pascal VOC(VOC 2012、VOC 2007) 数据集的简介

一、数据集介绍 PascalVOC(2005~2012)数据集是PASCAL VOC挑战官方使用的数据集。该数据集包含20类的物体。每张图片都有标注&#xff0c;标注的物体包括人、动物&#xff08;如猫、狗、岛等&#xff09;、交通工具&#xff08;如车、船飞机等&#xff09;、家具&#xff08;如椅…

Redux极客园项目初始化搭建

基本结构搭建 实现步骤 在 Login/index.js 中创建登录页面基本结构在 Login 目录中创建 index.scss 文件&#xff0c;指定组件样式将 logo.png 和 login.png 拷贝到 assets 目录中 代码实现 pages/Login/index.js import ./index.scss import { Card, Form, Input, Button }…

【LLM】认识LLM

文章目录 1.LLM1.1 LLM简介1.2 LLM发展1.3 市面常见的LLM1.4 LLM涌现的能力 2.RAG2.1 RAG简介2.2 RAG 的工作流程2.3 RAG 和 Finetune 对比2.4 RAG的使用场景分析 3. LangChain3.1 LangChain简介3.2 LangChain的核心组件3.3 LangChain 入门 4.开发 RAG 应用的整体流程5. 环境配…

GPT状态和原理 - 解密OpenAI模型训练

目录 1 如何训练 GPT 助手 1.1 第一阶段 Pretraining 预训练 1.2 第二阶段&#xff1a;Supervised Finetuning有监督微调 1.3 第三阶段 Reward Modeling 奖励建模 1.4 第四阶段 Reinforcement Learning 强化学习 1.5 总结 2 第二部分&#xff1a;如何有效的应用在您的应…

原生实现ajax

1 什么是ajax AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部分网…

unity学习(85)——同步节奏(tcp架构确实有问题)

挂的时间长了&#xff0c;就出现其他下线本地不destroy的情况了&#xff0c;而且此时再登录&#xff0c;新渲染中已经没有已经下线的玩家 unity这边就没有收到126&#xff01;&#xff01;&#xff01;125的问题是多种多样的&#xff01;&#xff01;&#xff01; 化简服务器w…

设计循环队列(队列oj)

1.设计循环队列 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。…

【笔记】vscode debug进入site-packages包源码

选择左侧栏第三个图标&#xff0c;点击创建 launch.json 文件 选择 Python Debugger 选择Python文件 这里可以看到launch.json 文件 在configurations中添加键值对 "justMyCode": false在文件中打上断点&#xff0c;点击"三角符"号开始调试 按F11或者红框…

reportlab 生成pdf文件 (python)

1 安装 pip install reportlab2 应用场景 通过网页动态生成PDF文档大量的报告和数据发布用XML一步生成PDF 官网案例 3 PLATYPUS Platypus是“Page Layout and Typography Using Scripts”&#xff0c;是使用脚本的页面布局和印刷术的缩写&#xff0c;这是一个高层次页面布局…

【面试题】MySQL 事务的四大特性说一下?

事务是一个或多个 SQL 语句组成的一个执行单元&#xff0c;这些 SQL 语句要么全部执行成功&#xff0c;要么全部不执行&#xff0c;不会出现部分执行的情况。事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。 事务的主要作用是保证数…

记一次kafkakerberos认证问题

1&#xff0c;报错信息 排查思路&#xff1a;检查kerberos配置文件 kerberos.kafka.principalkafka/huawe_baseSECURITY.COM kerberos.kafka.keytabPath/etc/huawe_base.keytab kerberos.kafka.krb5ConfPath/etc/krb5.conf但是查看kafka_client_jass.conf文件&#xff0c;发现…

网络基础-TCP/IP和OSI协议模型

一、OSI和TCP/IP模型 二、OSI七层模型 三、TCP/IP模型 参考&#xff1a;https://www.cnblogs.com/f-ck-need-u/p/7623252.html

关联规则挖掘(二)

目录 三、FP-增长算法&#xff08;一&#xff09;算法的背景&#xff08;二&#xff09;构造FP-树&#xff08;三&#xff09;生成频繁项集 四、关联规则的评价&#xff08;一&#xff09;支持度和置信度的不足&#xff08;二&#xff09;相关性分析 三、FP-增长算法 &#xf…